选择排序算法问题

时间:2016-12-24 16:52:55

标签: java arrays algorithm sorting selection-sort

所以我有这个代码用于我的选择排序:

public static void selectionSort(int[] arrayToSort){
    int smallest;
    for(int i = 0; i < arrayToSort.length; i++){
        smallest = i;
        for(int j = i+1; j < arrayToSort.length; j++){
            if(arrayToSort[j] < arrayToSort[smallest]){
                smallest = j;
            }
            if(smallest != i){
                int temp = arrayToSort[i];
                arrayToSort[i] = arrayToSort[smallest];
                arrayToSort[smallest] = temp;
            }
        }
    }
}

我正在生成一个带有随机数的int数组。我的选择排序有时会对数组进行排序,有时它确实会排序#34;几乎&#34;对数组进行排序。除了极少数位于错误位置的数字之外,数组将主要进行排序。我无法弄清楚这里出了什么问题,有什么想法吗?

某些测试结果,其中数组未完全排序:

***NON SORTED***
77
53
27
58
83
***SORTED***
27
53
77
58
83

***NON SORTED***
40
87
27
48
82
***SORTED***
27
40
82
48
87

3 个答案:

答案 0 :(得分:3)

你在内部循环中有一部分代码,把它放在循环之外;

public static void selectionSort(int[] arrayToSort){
    int smallest;
    for(int i = 0; i < arrayToSort.length; i++){
        smallest = i;
        for(int j = i+1; j < arrayToSort.length; j++){
            if(arrayToSort[j] < arrayToSort[smallest]){
                smallest = j;
            }
        }
        if(smallest != i){
            int temp = arrayToSort[i];
            arrayToSort[i] = arrayToSort[smallest];
            arrayToSort[smallest] = temp;
        }
    }
}

例如参见algorithm in Wikipedia

答案 1 :(得分:2)

我在大学项目中需要的时候这样做了!

参考:selection algoritm with figure

selection sort

public static void selectionSort(int[] arr){  
        for (int i = 0; i < arr.length - 1; i++)  
        {  
            int index = i;  
            for (int j = i + 1; j < arr.length; j++){  
                if (arr[j] < arr[index]){  
                    index = j;//searching for lowest index  
                }  
            }  
            int smallerNumber = arr[index];   
            arr[index] = arr[i];  
            arr[i] = smallerNumber;  
        }  
    }  

答案 2 :(得分:0)

这里面的第二个foor循环,如果你发现任何小于i(或最小)的元素你正在进行交换操作,这里不需要。在选择排序中,您需要从未排序的数组中获取最小元素并与最左边的元素交换,并且该元素成为排序数组的一部分。 只需将交换置于第二个内部循环之外,以便它只对最小元素进行交换操作。

for(int i = 0; i < arrayToSort.length; i++){
    smallest = i;
    for(int j = i+1; j < arrayToSort.length; j++){
        if(arrayToSort[j] < arrayToSort[smallest]){
            smallest = j;
        }
    }
    if(smallest != i){
        int temp = arrayToSort[i];
        arrayToSort[i] = arrayToSort[smallest];
        arrayToSort[smallest] = temp;
    }
}