[英]Selection sort in C. Why?
这是C中的简单代码(选择排序):
#include <stdio.h>
#include <stdlib.h>
#define ItemCount 10
int numbers[ItemCount] = {4,9,3,7,2,5,10,2,12,6};
int MinNumberIndex(int start) {
int i;
int minindex = start;
for (i = start + 1; i < ItemCount; i++)
if (numbers[minindex] > numbers[i])
minindex = i;
return minindex;
}
void SelectionSort() {
int i,temp,minindex;
for (i = 0; i < 10; i++) {
minindex = MinNumberIndex(i);
temp = numbers[i];
numbers[i] = numbers[minindex ];
numbers[minindex ] = temp;
}
}
int main() {
int i;
SelectionSort();
for (i = 0; i < 10; i++)
printf("%d\t", numbers[i]);
system("pause");
}
它工作正常......但如果我改变一点(在selectionSort函数中):
for (i = 0; i < 10; i++) {
temp = numbers[i];
numbers[i] = numbers[MinNumberIndex(i)];
numbers[MinNumberIndex(i)] = temp;
}
它不起作用......为什么? 它似乎是一样的。
MinNumberIndex返回的值取决于数组的内容。 当你这样做时,你正在改变内容:
numbers[i] = numbers[MinNumberIndex(i)];
所以下一个电话:
numbers[MinNumberIndex(i)] = temp;
将/可以存储到错误的单元格,因为MinNumberIndex(i)可以更改。 这会破坏算法,因为您没有进行适当的交换。
因为MinNumberIndex(i)
每次调用它都会返回不同的值,所以第二个版本实际上不是值交换。
由于MinNumberIndex(i)
返回范围[i,ItemCount-1]
最小元素的索引,并且您的备用代码版本修改了两次调用MinNumberIndex()
之间数组中的范围,因此您不需要交换元素。
您的备用循环等效于:
for (i=0;i<10;i++)
{
temp = numbers[i];
numbers[i] = numbers[MinNumberIndex(i)];
numbers[i] = temp;
}
更详细一点,当在for
循环中执行这行代码时:
numbers[i] = numbers[MinNumberIndex(i)];
它使numbers[i]
在你当时处理的数组范围中最小,因此下一次MinNumberIndex(i)
,它将返回i
。 和
numbers[i] = temp;
只会将数组恢复到循环顶部的状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.