1. 程式人生 > >經典排序算法--希爾排序

經典排序算法--希爾排序

... ack 例子 理解 不知道 希爾 記錄 pre ava

算法簡介

  希爾排序是1959 年由D.L.Shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。

白話理解:

  我們依然已排隊為例,加入隊伍中,有一些小個子站在了隊伍的後面,而一些大個子又站在了隊伍的前面,這是如果再使用插入排序,那就太沒有效率了。通常情況下,老師會先看一眼,然後將後面的小個子和前面的大個子互換位置。當這個隊伍順序差距不是特別明顯後,再使用插入排序。

  但是計算機沒辦法一眼看出來哪些元素差距比較大,於是我們可以每趟排序,根據對應的增量,將待排序列分割成若幹長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。(例子不是特別貼切...,暫時想不到更好的例子...)

例如:

  技術分享

Java代碼實現:

 1 package sortDemo;
 2 
 3 /**
 4  * 插入代碼實現
 5  * @author xianyu
 6  * @CreatTime 下午8:16:11
 7  */
 8 public class shellDemo {
 9     
10     public static void main(String[] args) {
11         int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
12         System.out.println("排序前:");
13         print(sort);
14 shellSort(sort); 15 System.out.println("\n排序後:"); 16 print(sort); 17 } 18 19 20 /** 21 * 直接插入算法排序 22 * @param a 23 */ 24 public static void shellSort(int[] a){ 25 26 //確定一個增量h,網上的一些說法,認為這種情況效率比較高,然後我並不知道為什麽。。。 27 int
h = 1; 28 int len = a.length; 29 while(h<len/3){ 30 h = h*3+1; 31 } 32 while(h>0){ 33 int in,out; 34 for ( out = h;out < a.length; out++) { 35 int tmp = a[out]; 36 for ( in = out-h; in>=0&&a[in]>tmp; in=in-h) { 37 a[in+h]=a[in]; 38 } 39 a[in+h] = tmp; 40 } 41 h=(h-1)/3; 42 } 43 } 44 45 public static void print(int[] a){ 46 for (int i = 0; i < a.length; i++) { 47 System.out.print(a[i]+" "); 48 } 49 } 50 }

算法分析

希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要註意:增量因子中除1 外沒有公因子,且最後一個增量因子必須為1。希爾排序方法是一個不穩定的排序方法。

經典排序算法--希爾排序