JAVA-直接插入排序
Posted yjl_2130
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-直接插入排序相关的知识,希望对你有一定的参考价值。
直接插入排序:
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有
元素为止。
代码
public static void main(String[] args) {
int[] array= {4,2,8,9,5,7,6,1,3};
System.out.println("未排序数组排列:");
display(array);
System.out.println("------------------------------");
sort(array);
System.out.println("------------------------------");
System.out.println("排序后数组排列:");
display(array);
}
public static int[] sort(int[] array){
int j;
//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
for (int i = 0; i <array.length ; i++) {
//记录要插入的数据
int temp = array[i];
j = i;
while (j > 0 && temp < array[j-1]){
//从已经排序的序列最右边的开始比较,找到比其小的数
//向后挪动
array[j] = array[j-1];
j--;
}
//存在比其小的数,插入
array[j] = temp;
System.out.print("第"+(i+1)+"轮排序后的结果为:");
display(array);
}
return array;
}
//遍历显示数组
public static void display(int[] array){
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+"");
}
System.out.println();
}
输出结果:
插入排序性能分析:
在第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第N轮,最多比较N-1次。因此有
1+2+3+…+N-1 = N*(N-1)/2。
假设在每一轮排序发现插入点时,平均只有全体数据项的一半真的进行了比较,我们除以2得到:N*(N-
1)/4。用大O表示法大致需要需要 O(N2) 时间级别。
复制的次数大致等于比较的次数,但是一次复制与一次交换的时间耗时不同,所以相对于随机数据,插入排序
比冒泡快一倍,比选择排序略快。
这里需要注意的是,如果要进行逆序排列,那么每次比较和移动都会进行,这时候并不会比冒泡排序快。
PS:
冒泡、选择、插入用大 O 表示法都需要 O(N2) 时间级别。一般不会选择冒泡排序,虽然
冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的。
选择排序把交换次数降低到最低,但是比较次数还是挺大的。当数据量小,并且交换数据相对于比较数据更加
耗时的情况下,可以应用选择排序。
在大多数情况下,假设数据量比较小或基本有序时,插入排序是三种算法中最好的选择
以上是关于JAVA-直接插入排序的主要内容,如果未能解决你的问题,请参考以下文章