我的插入排序输出不正确。当我试图调用insertionSort方法时,返回的数组没有排序
是否正确使用break语句?
public int[] insertionSort(int [] arr){
for(int i=1;i<arr.length;i++){
for(int j=0;j<=i-1;){
int temp;
if(arr[i] < arr[j]){
temp=arr[i]; arr[i]=arr[j]; arr[j]=temp;
break;
}
else j++;
}
}
return arr;
}
使用int [] array = {10,5,6,7,1,9,3,8}
调用方法,但结果不正确:
排序后的输出:1,3,7,8,5,10,6,9,//输出没有排序但是有点改变
答案 0 :(得分:1)
以下是有效的代码:
public static int[] insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
// Swap
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
}
return arr;
}
您的代码的一个问题是您将i-th
元素放在正确的位置,但可能会弄乱已经位于正确位置的元素的位置。
插入排序的想法是将i-th
元素插入正确的位置,这意味着您必须将所有元素移动到右侧。但是,在您的情况下,您只需在找到正确的位置后交换j-th
元素和i-th
。
示例:
1 3 5 8 10
这是数组的当前状态
现在你尝试插入元素6
,你发现正确的位置是3
,所以你交换它们,结果是:
1 3 5 6 10 8
混淆了数字8
的位置。