我正在尝试编写一个修改后的选择排序,选择最大的数字并将其放在列表的末尾。我遇到了一个问题。代码有点排序列表但不完美。这是我运行代码后的结果: 选择前排序:[2,8,7,1,3,5,9,4,6] 选择后排序:[1,2,8,7,3,4,5,9,6]
这是我的代码:
public static int[] sort(int[] list) {
int i, j, maxNum, maxInde, temp = 0;
for (i = list.length-1; i >= 0; i--) {
maxNum = list[i];
maxInde = i;
for (j = i; j < list.length; j++) {
if (list[j] < maxNum) {
maxNum = list[j];
maxInde = j;
}
}
if (maxNum < list[i]) {
temp = list[i];
list[i] = list[maxInde];
list[maxInde] = temp;
}
}
return list;
}
我不知道问题出在哪里。
答案 0 :(得分:3)
该算法在概念上存在缺陷,因为您从n-1
downto 0
扫描数组,并在每次迭代时从子数组a[n-1,...,i]
中选择最大元素。这个子数组应该总是被排序(并且应该由数组的n-i
最大元素组成)---这类似于经典选择排序的循环不变量---以及要插入的最大元素当前位置应来自其他子阵列,即a[i,...,0]
。
另外,正如评论中所提到的,没有必要返回数组,因为算法只能修改它。
答案 1 :(得分:1)
这是固定版本:
int i, j, maxNum, maxInde, temp = 0;
for (i = list.length-1; i >= 0; i--) {
// you start iterating from the end of the list
// which means that the elements between i and the end of the list are sorted
maxNum = list[i];
maxInde = i;
for (j = 0; j < i; j++) {
// you have to iterate through the nonsorted elements
if (list[j] > maxNum) {
maxNum = list[j];
maxInde = j;
}
}
if (maxNum > list[i]) {
// if you found an element that is bigger then the current element
// then it should be set as the current element
temp = list[i];
list[i] = list[maxInde];
list[maxInde] = temp;
}
}