算法相關——Java排序算法之希爾排序(五)

0. 前言java

本系列文章將介紹一些經常使用的排序算法。排序是一個很是常見的應用場景,也是開發崗位面試必問的一道面試題,有人說,若是一個企業招聘開發人員的題目中沒有排序算法題,那說明這個企業不是一個正規的企業,哈哈,雖然有點戲謔,可是也從側面證實了排序算法的重要性。面試

本文將介紹的是常見排序算法中的希爾排序算法


希爾排序性能

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

相關文章
相關標籤/搜索