我正在学习算法,并坚持选择排序。这是来源:
public static void sort(Comparable[]a){
int n= a.length;
for(int i=0;i<n;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(!isSmaller(a[min],a[j]))
min=j;
exch(a,i,min);
}
}
}
private static void exch(Comparable[] a, int i, int min) {
Comparable t =a[i];
a[i]=a[min];
a[min]=t;
}
private static boolean isSmaller(Comparable min, Comparable j){
return min.compareTo(j)<0;
}
public static void main(String[] args) {
Random rand = new Random(312312);
Integer[]list = new Integer[50];
System.out.print("Input: ");
for(int i=0; i<50;i++){
list[i]=rand.nextInt(50);
System.out.print(list[i]+" ");
}
sort(list);
System.out.println("Sorted.");
for(int k=0; k<50;k++){
System.out.print(list[k]+" ");
}
}
}
代码生成以下输出:
输入:19 34 6 26 13 2 5 32 40 49 20 33 22 38 4 35 32 30 12 3 24 10 3 37 28 22 13 15 1 27 6 46 16 1 31 2 28 15 8 6 38 8 40 6 7 12 2 48 10 27分类。
1 1 2 2 3 3 4 5 6 6 6 6 8 8 10 12 7 12 13 13 15 15 16 19 20 22 22 24 26 27 2 10 27 28 28 30 31 32 32 33 34 35 37 38 38 40 40 46 48 49
我在哪里失败?
答案 0 :(得分:1)
您的代码中存在问题:
for(int i=0;i<n;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(!isSmaller(a[min],a[j]))
min=j;
exch(a,i,min); // HERE
}
}
在实际未找到min
时交换值。因此,您会得到意想不到的输出。
你需要把它放在内部for循环之后。像这样:
for(int i=0;i<n;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(!isSmaller(a[min],a[j]))
min=j;
}
exch(a,i,min); // HERE
}
答案 1 :(得分:1)
您的代码中存在问题:
int n= a.length;
for(int i=0;i<n;i++){
int min=i;//here
for(int j=i+1;j<n;j++){
if(!isSmaller(a[min],a[j]))
min=j;
exch(a,i,min);
}
试试这个!!!
int n= a.length;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int min=i;//put it in inner loop
if(!isSmaller(a[min],a[j]))
min=j;
exch(a,i,min);
}