插入排序
点击查看代码
package Sort;
import java.util.*;
//插入排序:扑克牌从第二张开始往前排,相当于分成已排区跟待排区,已排区跟待排区的第一个元素比较。
public class 插入 {
public static void main(String[] args) {
int []a = {3,4,8,1,13,15,11,9,2,0};
//排序
for(int i=1;i<a.length;i++)
{
for(int j=i;j>0;j--)//跟前面的比
{
if(a[j]<a[j-1])//还小还往前换
{
int temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
else//因为当第一次的a[j]>a[j-1]时,a[j]就必定大于前面的数了,再排序就浪费时间
break;
}
}
System.out.println(Arrays.toString(a));
}
}
然而,在您的代码中,您使用了两个嵌套的for循环,但它们的逻辑与插入排序不同。您的代码实际上尝试通过从后向前遍历并与前一个元素进行比较来“排序”数组,但这种方式并不符合插入排序的标准实现。特别是,当您在内层循环中检测到a[j] >= a[j-1]时,您直接break跳出内层循环,这会导致排序不完整,因为您没有确保a[j]被正确地插入到已排序部分的适当位置。
下面是一个标准的插入排序实现,供您参考:
优化
点击查看代码
package Sort;
import java.util.Arrays;
// 插入排序:扑克牌从第二张开始往前排,相当于分成已排区跟待排区, 已排区跟待排区的元素比较。
public class InsertionSort {
public static void main(String[] args) {
int[] a = {3, 4, 8, 1, 13, 15, 11, 9, 2, 0};
// 排序
for (int i = 1; i < a.length; i++) {
int key = a[i]; // 选取未排序部分的第一个元素作为key
int j = i - 1;
// 将key插入到已排序部分的适当位置
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j]; // 元素后移
j--;
}
a[j + 1] = key; // 插入key
}
System.out.println(Arrays.toString(a));
}
}
浙公网安备 33010602011771号