这个程序主要是由我的教授照顾的,他留给我的是编写一个数组,该数组将对从文件中扫描的数组执行选择排序。
我在教科书的帮助下编写的代码几乎完美无缺。但输出是错误的,因为当输入文件中没有数字0时,输出中的前5个数字(应该按升序排序)都是0。数组中的最后5个数字(最大的5个)也不存在。
输出还以原始未排序的顺序列出输入文件中的数字,并且没有显示错误。所有数字都在那里。
我的方法代码:
private static void selectionSort( int arr[], int cnt)
{
int index;
int minIndex;
int minValue;
for (cnt=0; cnt < (arr.length-1); cnt++)
{
minIndex = cnt;
minValue = arr[cnt];
for (index = cnt + 1; index< arr.length; index++)
{
if (arr[index] < minValue)
{
minValue = arr[index];
minIndex = index;
}
}
arr[minIndex] = arr[cnt];
arr[cnt] = minValue;
}
}
这是输出:
原始rands2:75 62 110 144 108 146 121 119 61 164 170 34 78 41 89 84 74 132 156 160 94 55 76 97 48
已分类的rands2:0 0 0 0 0 34 41 48 55 61 62 74 75 76 78 84 89 94 97 108 110 119 121 132 144
我是否有任何错误导致这种情况发生?
答案 0 :(得分:1)
这似乎不是“延迟替换排序”a.k.a.选择排序的典型实现。
重要的是,在内部循环完成扫描新的最低元素后,您需要查看是否找到了新的最低元素,如果是,则进行交换。您的算法缺乏这一关键步骤。可能会发生外循环索引处的项目按顺序已经,并且不需要交换。
另外,如上所述,我不清楚为什么排序算法存储外部索引及其对应的值。你只需要索引,你的集合中的元素不会去任何地方(除非这是同时使用的,那就是......但是,整个'更加坚固的蜡球)。
这是延迟替换排序算法的伪代码:
Begin DELAYEDSORT
For ITEM=1 to maximum number of items in list-1
LOWEST=ITEM
For N=ITEM+1 to maximum number of items in list
Is entry at position N lower than entry at position LOWEST?
If so, LOWEST=N
Next N
Is ITEM different from LOWEST
If so, swap entry at LOWEST with entry in ITEM
Next ITEM
End DELAYEDSORT
关于选择排序的一些未经请求的说明: