插入排序--希尔排序及复杂度分析(图解)

希尔排序(缩小增量排序):

1959年Shell发明,第⼀个突破O(n^2)的排序算法,是简单插⼊排序的改进版。

基本思想:设待排序元素序列有n个元素,首先取一个整数【temp=n/2】作为间隔将全部元素分为temp个子序列,所有距离为temp的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔temp,重复上述子序列划分和排序工作。直到最后取temp=1,将所有元素放在同一个子序列中排序为止。

下面直接图示理解:

 

给出原序列:

 

 插入排序--希尔排序及复杂度分析(图解)_第1张图片

注意:有两个7,对第一个加了*标注,排序后位置发生改变。


 

插入排序--希尔排序及复杂度分析(图解)_第2张图片

 

 插入排序--希尔排序及复杂度分析(图解)_第3张图片

插入排序--希尔排序及复杂度分析(图解)_第4张图片

 

 最终序列:

插入排序--希尔排序及复杂度分析(图解)_第5张图片

 

上代码实现: 

class SortWork {
    public static void printArray(int[] array) {//工具方法
        for (int i : array) {
            System.out.print(i + " ");
        }
    }
}

public class Bubble {

    public static void main(String[] args) {
        int[] array = new int[]{5,8,12,7,10,3,7,9};    
        shellSort(array);
        SortWork.printArray(array);
    }
    
    public static void shellSort(int[] array) {        
        int n = array.length;
        if (n <= 1) {
            return;
        } else {
            int temp = n / 2;
            while (temp >= 1) {
                for (int i = temp; i < n; i++) {
                    int val = array[i];
                    int j = i - temp;
                    for (; j >= 0; j -= temp) {
                        if (val < array[j]) {
                            array[j + temp] = array[j];
                        }else {
                            break;
                        }
                    }
                    array[j+temp] = val;
                }
                temp /=2;
            }
        }
    }
}

最后附上代码运行结果:

插入排序--希尔排序及复杂度分析(图解)_第6张图片

复杂度进行分析: 

时间复杂度:

介于O( n ^2)和O(nlogn)之间,视它的最好最坏以及平均复杂度具体分析

空间复杂度:

在排序过程中,并没有新数组的产生,所以空间复杂度是 O( 1 )

稳定性:

在排序完成后,两个相同的元素位置(上面图示的7*和7)位置发生了改变,所以是不稳定的

 

 

理解至此,结束!!!

你可能感兴趣的:(Java,算法—排序)