插入排序与希尔排序Java版

作者: 张可_ | 来源:发表于2019-04-12 00:02 被阅读4次

    插入排序

    时间复杂度:O(n²)

    插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用 in-place 排序(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。——维基百科

    public void sort(int[] data) {
        int tmp;
        int j;
        for (int p = 1; p < data.length; p++) {
            tmp = data[p];
            for (j = p; j > 0 && data[j - 1] > tmp; j--) {
                data[j] = data[j - 1];
            }
            data[j] = tmp;
        }
    }
    

    希尔排序

    原始的算法实现在最坏的情况下需要进行 O(n2) 的比较和交换。优化后性能提升至 O(n log2 n)。这比最好的比较算法的 O(n log n) 要差一些。

    该算法是冲破二次时间屏障的第一批算法之一。
    希尔排序有时也叫做缩小增量排序(diminishing increment sort)。
    希尔排序使用一个序列 h1,h2,h3,...ht,叫做增量序列(increment sequence),只要 h1 = 1,任何增量序列都是可行的。

    public void sort(int[] array) {
        int number = array.length / 2;
        int i;
        int j;
        int temp;
        while (number >= 1) {
            for (i = number; i < array.length; i++) {
                temp = array[i];
                j = i - number;
                while (j >= 0 && array[j] > temp) {
                    array[j + number] = array[j];
                    j = j - number;
                }
                array[j + number] = temp;
            }
            number = number / 2;
        }
    }
    

    使用不同的增量序列时间复杂度也都各不相同。

    如果觉得还不错的话,欢迎关注我的公众号,我会不定期发一些干货~

    公众号

    也可以加我微信:

    个人微信

    相关文章

      网友评论

        本文标题:插入排序与希尔排序Java版

        本文链接:https://www.haomeiwen.com/subject/tqgfwqtx.html