选择排序,K是干啥的以及第二个for循环范围
void selectSort2(int array[ ],int n){
int i,j,k,t;
for(i = 0;i < n-1;i++)
{ k = i;
for(j = i+1;j < n;j++)
if(array<array)
k = j;
t = array;array =array;array = t;
}
}
这是教材上写的。
后边这个是我写的。
void selectSort(int z[ ],int n)
{
int i,j;
for(j = 0;j<n-1;j++)
{
for(i = j+1;i<n;i++)
{
if(z>z)
{
int t;
t = z;
z = z;
z = t;
}
}
}
}
搞不通,教材弄个K沙意识,
教材第二个for范围是那几句
谢谢大家啦 k 代表 i ~ n-1 里的最小值的下标
你可以看到, 循环里只要发现 a 大于 a 就立刻把 k 赋值为 j
这样循环结束之后交换最小值和 i 的位置就完成了一次排序 鱼油您好!
在这个选择排序的代码片段中,内层 `for` 循环的范围有些模糊,让我给您完整解释一下。
void selectSort2(int array[], int n)
{
int i, j, k, t;
for(i = 0; i < n-1; i++)
{
k = i;
for(j = i+1; j < n; j++)
{
if(array < array)
{
k = j;
}
}
if(k != i)
{
t = array;
array = array;
array = t;
}
}
}
这个选择排序函数的作用是对一个数组进行排序。
1. **外层循环 (for i)**:从数组第一个元素开始,每次增加一次迭代。在第 `i` 次迭代中,外层循环确保从第 `i` 个元素到最后一个元素中选出最小的元素,并将其与第 `i` 个元素交换位置。
2. **内层循环 (for j)**:从 `i + 1` 开始,到 `n` 结束,用于找到从 `i` 到最后一个元素中的最小值。
3. **条件判断和交换 (if 语句)**:如果找到的最小值不是当前的第 `i` 个元素,那么交换它们的位置。
这个逻辑确保每一次外层循环后,数组前 `i+1` 个元素是有序的。
希望这个解释对您有所帮助!如果有其他问题,请随时问我。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-8-25 22:25
鱼油您好!
在这个选择排序的代码片段中,内层 `for` 循环的范围有些模糊,让我给您完整解释一下。
您好老师,按照我写的方式不是更简洁吗,为啥一定要有这个K,好多程序里有这个K或者index,这样做是不是多此一举 八义士 发表于 2024-8-26 09:28
您好老师,按照我写的方式不是更简洁吗,为啥一定要有这个K,好多程序里有这个K或者index,这样做是不是 ...
谢谢老师啦 八义士 发表于 2024-08-26 09:28
您好老师,按照我写的方式不是更简洁吗,为啥一定要有 ...
鱼油您好!关于选择排序中的 `k` 或 `index`,让我解释一下其作用以及是否必要。
在选择排序算法中,`k` 或 `index` 的主要作用是跟踪当前最小元素的位置。这是因为我们在找最小值的过程中,不仅需要知道最小值的大小,还需要知道它的位置,以便进行交换。
具体来说:
- `k` 或 `index` 初始化为当前外层循环的起始位置(i)。
- 内层循环遍历未排序部分,找到最小值的位置并更新 `k` 或 `index`。
- 找到最小值的位置后,再用 `k` 来交换最小值和当前位置(i)的值。
如果不使用 `k`,代码就无法跟踪最小值的位置,排序逻辑将无法正确实现。
下面是您的代码完成后补充的部分以及如何改用 `k`:
void selectSort2(int array[], int n)
{
int i, j, k, t;
for(i = 0; i < n-1; i++)
{
k = i;// 假设当前索引 i 是最小值
for(j = i+1; j < n; j++)
{
if(array < array)// 找到更小的值时更新 k
{
k = j;// 记录最小值的位置
}
}
// 如果找到的最小值不是当前位置(i),则交换它们
if(k != i)
{
t = array;
array = array;
array = t;
}
}
}
总结起来,`k` 或 `index` 的作用是必要的,因为它们帮助跟踪最小值的位置,使得选择排序算法可以正确地进行元素交换。没有 `k` 或 `index`,算法无法正确识别和处理每一步中的最小元素。
希望这个解释能帮助你理解!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 八义士 发表于 2024-08-26 09:28
您好老师,按照我写的方式不是更简洁吗,为啥一定要有 ...
鱼油您好!
选择排序中使用`k` 或者 `index` 是为了记录最小元素的位置,从而优化代码的可读性和逻辑清晰度。虽然可以在没有 `k` 的情况下直接交换元素,但使用 `k` 可以使代码更加简洁和易于理解。
让我们看看不使用 `k` 的版本和使用 `k` 的版本,进行对比:
### 不使用 `k` 的版本:
void selectSort2(int array[], int n) {
int i, j, t;
for(i = 0; i < n - 1; i++) {
for(j = i + 1; j < n; j++) {
if(array < array) {
t = array;
array = array;
array = t;
}
}
}
}
### 使用 `k` 的版本:
void selectSort2(int array[], int n) {
int i, j, k, t;
for(i = 0; i < n - 1; i++) {
k = i;
for(j = i + 1; j < n; j++) {
if(array < array) {
k = j;
}
}
if(k != i) {
t = array;
array = array;
array = t;
}
}
}
**优点总结:**
1. **逻辑清晰**:使用 `k` 明确地表示当前找到的最小值的位置,使得逻辑清楚。
2. **减少不必要的交换**:避免在内层循环中每次找到更小值时都交换元素,从而减少不必要的交换操作,提高运行效率。
虽然不使用 `k` 也可以实现选择排序,但使用 `k` 会让代码更加清晰和高效。需要更少的错误检查和边界情况处理,显得更加专业。
希望这个解释能帮助你理解为什么在选择排序中很多程序都使用 `k` 或 `index` 来记录最小元素的位置。如有其他问题,欢迎继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-8-26 09:33
鱼油您好!
选择排序中使用`k` 或者 `index` 是为了记录最小元素的位置,从而优化代码的可读性和逻 ...
我好像明白了老师
内循环用k标记位置,通过比较大小但不交换位置的方式找到最小值及其位置。把它和外循环作比较,小的换交换位置。
我写的是每一次内循环和外循环比,小的时候就交换位置,是这样吧。
八义士 发表于 2024-08-26 16:05
我好像明白了老师
内循环用k标记位置,通过比较大小 ...
鱼油您好!您理解得非常正确!
选择排序的核心思想确实是通过内循环找到最小值的位置,然后通过外循环进行位置交换。使用 `k` 标记最小值的位置,可以在减少交换次数的同时使逻辑更加清晰。代码中通过 `k` 标记当前找到的最小值索引,只在确定最小值后进行一次交换,而不是每次比较后立即交换。
让我们把完整的代码写出来并解释一下:
void selectSort2(int array[], int n) {
int i, j, k, t;
for (i = 0; i < n - 1; i++) {
k = i; // 初始化 k 为当前外循环的 i
for (j = i + 1; j < n; j++) {
if (array < array) { // 如果找到更小的元素,更新 k 为该元素的位置
k = j;
}
}
if (k != i) { // 如果 k 发生变化,说明找到了更小的元素,进行交换
t = array;
array = array;
array = t;
}
}
}
总结一下:
1. `k` 用于标记当前内循环找到的最小元素的位置。
2. 内循环 (`for`) 通过比较大小找到最小值的位置并更新 `k`。
3. 外循环通过 `k` 与 `i` 进行比较,若 `k` 更新过,交换位置,确保每次内循环只在确定了最小元素后进行一次交换。
这种方式减少不必要的交换操作,使算法更加高效。希望这可以帮助您进一步理解选择排序的工作原理!如果有其他问题,随时询问哦。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]