所以我有这个代码用于我的选择排序:
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
答案 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;
}
}
}
答案 1 :(得分:2)
我在大学项目中需要的时候这样做了!
参考:selection algoritm with figure
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;
}
}