修改选择排序,选择最大数字

时间:2016-04-02 18:10:41

标签: java arrays sorting selection sorted

我正在尝试编写一个修改后的选择排序,选择最大的数字并将其放在列表的末尾。我遇到了一个问题。代码有点排序列表但不完美。这是我运行代码后的结果:                 选择前排序:[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;
}  

我不知道问题出在哪里。

2 个答案:

答案 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;
    }
}