直接插入排序和希尔排序

算法过程:

序列S = {S0, S1, S2, ..., Sn-1}是n个可排序的序列,则

(1). 令i从1递增到n-1,重复步骤(2)-(5).

(2). 将元素Si保存到临时变量tmp,令j = i-1.

(3). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0.

(4). 在(3)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+1,...,Si}.

(5). 将临时变量tmp放到Sj处。

    public void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            while (j >= 0 && tmp < array[j]) {
                array[j+1] = array[j];
                j--;
            }
            array[j+1] = tmp;
        }
    }

直接插入排序算法复杂度:

时间复杂度:无序 O(N2),反序O(N2),正序O(N)

空间复杂度:O(1)

直接插入排序是稳定的排序方法。

下面介绍希尔排序,希尔排序是直接插入排序的扩展,即把数据长度由1变成len/2。

算法过程:

(1). 先取一个小于n的数据长度间隔dataLen,不防令dataLen=len(array)/2.

(2). 当dataLen不等于0时,重复步骤(3)-(8).

(3). 令i从dataLen递增到n-1,重复步骤(4)-(7).

(4). 将元素Si保存到临时变量tmp,令j = i - dataLen.

(5). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0。注意j 以dataLen递减,而不是1.

(6). 在(5)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+dataLen,...,Si-1+dataLen}.

(7). 将临时便令tmp放到Sj处.

(8). 重置dataLen=len(array)/2。

    public void shellSort(int[] array) {
        int dataLen = array.length/2;
        while (dataLen != 0) {
            for (int i = dataLen; i < array.length; i++) {
                int tmp = array[i];
                int j = i - dataLen;
                while (j >= 0 && tmp < array[j]) {
                    array[j + dataLen] = array[j];
                    j -= dataLen;
                }
                array[j + dataLen] = tmp;
            }
            dataLen = dataLen/2;
        }
    }

希尔排序算法复杂度分析:

希尔排序执行时间取决于数据长度间隔dataLen,时间性能优于直接插入排序,是一种不稳定的排序方法。

原文地址:https://www.cnblogs.com/lasclocker/p/4862194.html