圖解排序算法(二)之希爾排序

希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法烈掠。希爾排序也是一種插入排序,它是簡單插入排序經(jīng)過改進(jìn)之后的一個(gè)更高效的版本缸托,也稱為縮小增量排序向叉,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)嗦董。

基本思想

  希爾排序是把記錄按下標(biāo)的一定增量分組母谎,對(duì)每組使用直接插入排序算法排序;隨著增量逐漸減少京革,每組包含的關(guān)鍵詞越來越多奇唤,當(dāng)增量減至1時(shí),整個(gè)文件恰被分成一組匹摇,算法便終止咬扇。

  簡單插入排序很循規(guī)蹈矩,不管數(shù)組分布是怎么樣的廊勃,依然一步一步的對(duì)元素進(jìn)行比較懈贺,移動(dòng),插入坡垫,比如[5,4,3,2,1,0]這種倒序序列梭灿,數(shù)組末端的0要回到首位置很是費(fèi)勁,比較和移動(dòng)元素均需n-1次冰悠。而希爾排序在數(shù)組中采用跳躍式分組的策略堡妒,通過某個(gè)增量將數(shù)組元素劃分為若干組,然后分組進(jìn)行插入排序溉卓,隨后逐步縮小增量皮迟,繼續(xù)按組進(jìn)行插入排序操作搬泥,直至增量為1。希爾排序通過這種策略使得整個(gè)數(shù)組在初始階段達(dá)到從宏觀上看基本有序伏尼,小的基本在前忿檩,大的基本在后。然后縮小增量爆阶,到增量為1時(shí)燥透,其實(shí)多數(shù)情況下只需微調(diào)即可,不會(huì)涉及過多的數(shù)據(jù)移動(dòng)扰她。

我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2芭碍,縮小增量繼續(xù)以gap = gap/2的方式徒役,這種增量選擇我們可以用一個(gè)序列來表示,{n/2,(n/2)/2...1}窖壕,稱為增量序列忧勿。希爾排序的增量序列的選擇與證明是個(gè)數(shù)學(xué)難題,我們選擇的這個(gè)增量序列是比較常用的瞻讽,也是希爾建議的增量鸳吸,稱為希爾增量,但其實(shí)這個(gè)增量序列不是最優(yōu)的速勇。此處我們做示例使用希爾增量晌砾。

代碼實(shí)現(xiàn)

  在希爾排序的理解時(shí),我們傾向于對(duì)于每一個(gè)分組烦磁,逐組進(jìn)行處理养匈,但在代碼實(shí)現(xiàn)中,我們可以不用這么按部就班地處理完一組再調(diào)轉(zhuǎn)回來處理下一組(這樣還得加個(gè)for循環(huán)去處理分組)比如[5,4,3,2,1,0] 都伪,首次增量設(shè)gap=length/2=3,則為3組[5,2] [4,1] [3,0]呕乎,實(shí)現(xiàn)時(shí)不用循環(huán)按組處理,我們可以從第gap個(gè)元素開始陨晶,逐個(gè)跨組處理猬仁。同時(shí),在插入數(shù)據(jù)時(shí)先誉,可以采用元素交換法尋找最終位置湿刽,也可以采用數(shù)組元素移動(dòng)法尋覓。希爾排序的代碼比較簡單褐耳,如下:

1 package sortdemo;

2

3 import java.util.Arrays;

4

5 /**

6? * Created by chengxiao on 2016/11/24.

7? */

8 public class ShellSort {

9? ? public static void main(String []args){

10? ? ? ? int []arr ={1,4,2,7,9,8,3,6};

11? ? ? ? sort(arr);

12? ? ? ? System.out.println(Arrays.toString(arr));

13? ? ? ? int []arr1 ={1,4,2,7,9,8,3,6};

14? ? ? ? sort1(arr1);

15? ? ? ? System.out.println(Arrays.toString(arr1));

16? ? }

17

18? ? /**

19? ? ? * 希爾排序 針對(duì)有序序列在插入時(shí)采用交換法

20? ? ? * @param arr

21? ? ? */

22? ? public static void sort(int []arr){

23? ? ? ? //增量gap叭爱,并逐步縮小增量

24? ? ? ? for(int gap=arr.length/2;gap>0;gap/=2){

25? ? ? ? ? ? //從第gap個(gè)元素,逐個(gè)對(duì)其所在組進(jìn)行直接插入排序操作

26? ? ? ? ? ? for(int i=gap;i<arr.length;i++){

27? ? ? ? ? ? ? ? int j = i;

28? ? ? ? ? ? ? ? while(j-gap>=0 && arr[j]<arr[j-gap]){

29? ? ? ? ? ? ? ? ? ? //插入排序采用交換法

30? ? ? ? ? ? ? ? ? ? swap(arr,j,j-gap);

31? ? ? ? ? ? ? ? ? ? j-=gap;

32? ? ? ? ? ? ? ? }

33? ? ? ? ? ? }

34? ? ? ? }

35? ? }

36

37? ? /**

38? ? ? * 希爾排序 針對(duì)有序序列在插入時(shí)采用移動(dòng)法漱病。

39? ? ? * @param arr

40? ? ? */

41? ? public static void sort1(int []arr){

42? ? ? ? //增量gap买雾,并逐步縮小增量

43? ? ? ? for(int gap=arr.length/2;gap>0;gap/=2){

44? ? ? ? ? ? //從第gap個(gè)元素衔沼,逐個(gè)對(duì)其所在組進(jìn)行直接插入排序操作

45? ? ? ? ? ? for(int i=gap;i<arr.length;i++){

46? ? ? ? ? ? ? ? int j = i;

47? ? ? ? ? ? ? ? int temp = arr[j];

48? ? ? ? ? ? ? ? if(arr[j]<arr[j-gap]){

49? ? ? ? ? ? ? ? ? ? while(j-gap>=0 && temp<arr[j-gap]){

50? ? ? ? ? ? ? ? ? ? ? ? //移動(dòng)法

51? ? ? ? ? ? ? ? ? ? ? ? arr[j] = arr[j-gap];

52? ? ? ? ? ? ? ? ? ? ? ? j-=gap;

53? ? ? ? ? ? ? ? ? ? }

54? ? ? ? ? ? ? ? ? ? arr[j] = temp;

55? ? ? ? ? ? ? ? }

56? ? ? ? ? ? }

57? ? ? ? }

58? ? }

59? ? /**

60? ? ? * 交換數(shù)組元素

61? ? ? * @param arr

62? ? ? * @param a

63? ? ? * @param b

64? ? ? */

65? ? public static void swap(int []arr,int a,int b){

66? ? ? ? arr[a] = arr[a]+arr[b];

67? ? ? ? arr[b] = arr[a]-arr[b];

68? ? ? ? arr[a] = arr[a]-arr[b];

69? ? }

70 }


總結(jié)

本文介紹了希爾排序的基本思想及其代碼實(shí)現(xiàn)苔埋,希爾排序中對(duì)于增量序列的選擇十分重要,直接影響到希爾排序的性能。我們上面選擇的增量序列{n/2,(n/2)/2...1}(希爾增量)痪欲,其最壞時(shí)間復(fù)雜度依然為O(n2),一些經(jīng)過優(yōu)化的增量序列如Hibbard經(jīng)過復(fù)雜證明可使得最壞時(shí)間復(fù)雜度為O(n3/2)毛肋。希爾排序的介紹到此為止梨水,關(guān)于其他排序算法的介紹也會(huì)陸續(xù)更新,謝謝支持僚饭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末震叮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳍鸵,更是在濱河造成了極大的恐慌苇瓣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偿乖,死亡現(xiàn)場離奇詭異击罪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贪薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門媳禁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人画切,你說我怎么就攤上這事竣稽。” “怎么了霍弹?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵丧枪,是天一觀的道長。 經(jīng)常有香客問我庞萍,道長拧烦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任钝计,我火速辦了婚禮恋博,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘私恬。我一直安慰自己债沮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布本鸣。 她就那樣靜靜地躺著疫衩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荣德。 梳的紋絲不亂的頭發(fā)上闷煤,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天童芹,我揣著相機(jī)與錄音,去河邊找鬼鲤拿。 笑死假褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的生音。 我是一名探鬼主播缀遍,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼域醇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冤寿,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤歹苦,失蹤者是張志新(化名)和其女友劉穎青伤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡立帖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晓勇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堂飞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰筛。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铝噩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窿克,我是刑警寧澤骏庸,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布毛甲,位于F島的核電站,受9級(jí)特大地震影響敞恋,放射性物質(zhì)發(fā)生泄漏丽啡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一硬猫、第九天 我趴在偏房一處隱蔽的房頂上張望补箍。 院中可真熱鬧,春花似錦啸蜜、人聲如沸坑雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹粤。三九已至,卻和暖如春蜂林,著一層夾襖步出監(jiān)牢的瞬間遥诉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工噪叙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矮锈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓睁蕾,卻偏偏與公主長得像苞笨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子子眶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 簡介 希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法瀑凝。希爾排序也是一種插入排序,它是簡單...
    尼小摩閱讀 549評(píng)論 0 0
  • 十大經(jīng)典排序算法 來源:https://github.com/wangguanfu/-Sorting-algori...
    星丶雲(yún)閱讀 790評(píng)論 0 7
  • 總結(jié)一下常見的排序算法臭杰。 排序分內(nèi)排序和外排序粤咪。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,326評(píng)論 0 1
  • Sort Algorithm(ASC) [TOC] //怎么生成目錄渴杆,糾結(jié)ing 插入排序 每一趟排序都將待排元素...
    一條小袍袍YoY閱讀 430評(píng)論 0 1
  • 今天和老爸在吃飯期間討論起關(guān)于機(jī)遇和能力的問題寥枝,關(guān)于能力與機(jī)遇二者的關(guān)系到?jīng)]有發(fā)生太大的分歧,都一致認(rèn)為有能力要有...
    52hz的黑豆豆閱讀 281評(píng)論 0 2