0. 前言java
本系列文章將介紹一些經常使用的排序算法。排序是一個很是常見的應用場景,也是開發崗位面試必問的一道面試題,有人說,若是一個企業招聘開發人員的題目中沒有排序算法題,那說明這個企業不是一個「正規」的企業,哈哈,雖然有點戲謔,可是也從側面證實了排序算法的重要性。面試
本文將介紹的是常見排序算法中的希爾排序。算法
5 希爾排序性能
5.1 基本思想優化
希爾排序是對插入排序的一個改進,希爾排序首先把待排數列按照必定增量進行分割,好比{3,1,5,9,6,5,0,2,4,12}數列,咱們首先設置增量爲n/2=5,所以有了分塊後5個子塊,即{3,5},{1,0},{5,2},{9,4},{6,12},將每一個子塊進行插入排序(即第i位與第i+5位進行比較交換),初步排序結果爲{3,0,2,4,6,5,1,5,9,12}。希爾排序再將增量逐漸減少,進行5/2=2的分塊,即{3,2,6,1,9},{0,4,5,5,12},同理插入排序得{1,0,2,4,3,5,6,5,9,12},最終進行2/2=1分塊,即對上數列直接進行插入排序獲得最終序列{0,1,2,3,4,5,5,6,9,12}。this
5.2 代碼實現spa
/* *@author Calvin *@blog http://blog.csdn.net/seu_calvin/article/details/56879397 *@date 2017/02/24 */ public class Order { private int[] array; public Order(int[] array){ this.array = array; } public void sort() { if(array!=null && array.length>0){ //增量遞減 for(int k = array.length/2; k>0; k/=2){ for(int i = k; i<array.length ; i++){ for(int j = i; j>=k; j-=k){ if(array[j-k] > array[j]){ int temp = array[j-k]; array[j-k] = array[j]; array[j] = temp; } } } } } } public void print() { for(int i = 0; i < array.length; i++) System.out.println(array[i]); } public static void main(String[] args) { int[] array = new int[]{3,1,5,9,6,5,0,2,4,12}; Order order = new Order(array); order.sort(); order.print(); } }輸出結果略。
5.3 性能特色.net
希爾排序是對插入排序的優化,希爾排序因爲增量初始值以及增量每次如何遞減的方式不必定,所以時間複雜度也不肯定。若是每次都除2,則最壞的狀況和直接插入排序的時間複雜度同樣是O(n*n),可是通常認爲希爾排序的複雜度爲O(n^1.3),空間複雜度爲O(1),希爾排序是不穩定的算法,由於一樣的值若不在一個組內,可能後面的值會被移動到前面。code
希爾排序須要選擇合適的增量序列,這是比較複雜的,所以希爾排序重在優化思路,現實中比較少用。blog