我在此选择排序中遇到输出问题。
以下是代码:
public class SelectionSort{
public static void main(String args[]){
int [] arr_sort = {1, 7, 2, 18, 23, 13};
System.out.println("Selection Sort");
System.out.print("Before sorting: ");
int x;
for(x=0; x<arr_sort.length; x++){
System.out.print(arr_sort[x] + " ");
}
System.out.println("");
System.out.print("After sorting: ");
int n = arr_sort.length;
int i,j, min, temp;
for(i=0; i<n; i++){
min=1;
for(j=i+1; j<n; j++){
if (arr_sort[j]<arr_sort[min]){
min=j;
temp=arr_sort[i];
arr_sort[i]=arr_sort[min];
arr_sort[min]=temp;
}
}
System.out.print(arr_sort[i] + " ");
}
}
}
输出:
Selection Sort
Before sorting: 1 7 2 18 23 13
After sorting: 2 1 7 18 23 13
答案 0 :(得分:0)
在循环外声明min
的事实是问题。
当开始新的迭代时,它仍将保留旧值,因此您将与已找到的元素进行比较并选择最小值。
另外,min
不应该是1
,而应该改为i
,因为您不希望在每一步与第二个元素进行比较。
在这些更改之后,它可以正常工作,但它不是真正的选择排序,您需要找到最小值,然后才能找到交换,而不是每次找到更小的元素。
代码:
int n = arr_sort.length;
int i, j, temp; // min removed here
for (i = 0; i < n; i++)
{
int min = i; // min declared here and changed to i
for (j = i + 1; j < n; j++)
{
if (arr_sort[j] < arr_sort[min])
{
min = j;
}
}
// moved swap to here
temp = arr_sort[i];
arr_sort[i] = arr_sort[min];
arr_sort[min] = temp;
System.out.print(arr_sort[i] + " ");
}