JAVA-直接插入排序

直接插入排序:

直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有
元素为止。
JAVA-直接插入排序_第1张图片

代码
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  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 

输出结果:

JAVA-直接插入排序_第2张图片

插入排序性能分析:

在第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第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,插入排序)