排序算法 直接插入排序及改进

Posted 杨同不爱吃洋葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法 直接插入排序及改进相关的知识,希望对你有一定的参考价值。

  • 直接插入排序

直接插入排序就是每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。比较简单就直接上代码了。

  • 代码

public static <T extends Comparable<? super T>> void insertionSort(T[] a) {
        int j;
        
        for (int i = 1; i < a.length; i++) {
            T tmp = a[i];
            for (j = i; j > 0 && tmp.compareTo(a[j-1]) < 0; j--) {
                a[j] = a[j-1];
            }
            a[j] = tmp;
        }
    }
  • 二叉查找插入排序

又之前的代码可以看出,直接插入排序的时间复杂度为O(n2),而且还可以看出,每次有新数据往里插的时候,都是从最后开始往前遍历,因为之前的数据已经是排好序的了,所以,我在查找应该插哪的时候,就可以使用二叉查找法来定位。这也是我看JDK源码Arrays.sort()方法时发现的。

  • 代码

public static <T> void insertionSortWithBinary(T[] a, Comparator<? super T> c) {
        int lo = 0;
        int hi = a.length;
        int start = 1;
        
        for ( ; start < hi; start++) {
            T pivot =  a[start];

            int left = lo;
            int right = start;
            
            while (left < right) {
                int mid = (left + right) >>> 1;
                if (c.compare(pivot,a[mid]) < 0)
                    right = mid;
                else
                    left = mid + 1;
            }
            assert left == right;

           
            int n = start - left;  
            switch (n) {
                case 2:  a[left + 2] = a[left + 1];
                case 1:  a[left + 1] = a[left];
                         break;
                default: System.arraycopy(a, left, a, left + 1, n);
            }
            a[left] = pivot;
        }
        
    }

 

以上是关于排序算法 直接插入排序及改进的主要内容,如果未能解决你的问题,请参考以下文章

第十六周 项目3--归并排序算法改进

第十六周 项目3--归并排序算法改进

小橙书阅读指南——希尔排序及改进算法

希尔排序算法(缩小增量排序)及C语言实现

直接插入排序到希尔排序做的那些改进

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)