<<大話數(shù)據(jù)結(jié)構(gòu)>>之淺談直接插入排序算法

尤瑟納而女士借阿德里安之口云静檬,當(dāng)一個人寫作或計算時帘营,就超越了性別图谷,甚至超越了人類——當(dāng)你寫作和計算時翩活,就是在思考阱洪。


大話數(shù)據(jù)結(jié)構(gòu)修改版.png


聊聊<<大話>>中直接插入排序的那些坑


我就不說為什么要學(xué)習(xí)直接插入排序,那樣豈不是太老套了.今天我就說說看<<大話數(shù)據(jù)結(jié)構(gòu)>>中的直接插入排序算法的坑,一開始看大話數(shù)據(jù)結(jié)構(gòu)的時候,就曾經(jīng)有很多人跟我說,這本書有很多的坑,別跳進(jìn)去,今天我就義無反顧的跳了進(jìn)去.而且是不帶回頭的??.整整四頁紙的直接插入排序算法,我搞了一天(可能是我太笨了)!一開始我在Xcode(Mac上OC語言的編譯器)上按照OC的方式把大話數(shù)據(jù)結(jié)構(gòu)的代碼擼了一遍.還沒編譯運行呢,我就看出一個問題來,數(shù)組越界....我的內(nèi)心是崩潰的.但是我稍稍的修改了一下.一運行,還是不對,沒辦法,我只好從網(wǎng)上找各種關(guān)于直接插入排序算法的技巧.然后,我就發(fā)現(xiàn)問題的原因是哨兵的問題,好了,我原諒他了..因為函數(shù)不同,所以,我只好重新用在本子上演算過程.里里外外花了一下午左右吧.下面我就把不同的位置標(biāo)記出來,為后來之人指一條明路.不說了美圖我會這么說?直接上圖!

這個錯誤是導(dǎo)致數(shù)組越界.


哨兵問題


直接插入排序算法概念及基本思想


直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當(dāng)位置菠镇,直到全部記錄插入完成為止冗荸。


直接插入排序算法的實現(xiàn)


首先我們看一下,用文字是如何表達(dá)實現(xiàn)過程.

設(shè)數(shù)組為dataArray[0…n-1]。
1. 初始時利耍,dataArray[0]自成1個有序區(qū)蚌本,無序區(qū)為dataArray[1..n-1]。令i=1
2. 將dataArray[i]并入當(dāng)前的有序區(qū)dataArray[0…i-1]中形成a[0…i]的有序區(qū)間隘梨。
3. i++并重復(fù)第二步直到i==n-1程癌。排序完成。

文字說的還是有點生硬,看一下用OC語言代碼是如何實現(xiàn)直接插入排序算法的.代碼的注釋已經(jīng)很詳細(xì),需要加斷點自己查看控制臺的打印信息.這里我寫在了ViewController的ViewDidLoad中.

- (void)viewDidLoad {
    [super viewDidLoad];

    //數(shù)據(jù)源數(shù)組
    NSMutableArray *dataArray = [NSMutableArray arrayWithArray:@[@0,@5,@3,@4,@6,@2]];
    
    int i,j;
    
    NSNumber *temp = [[NSNumber alloc]init];//這里就是要修改過的哨兵(OC版本的,其他語言自行探索??)
    
    for (i = 1; i< dataArray.count; i++) {
        
        NSLog(@"%@",dataArray);//打印每一次的變化,不管是否有新的元素插入有序表中(需要斷點打印查看)

        
        //判斷當(dāng)前的下標(biāo)i的數(shù)組元素是否大于下標(biāo)i-1的數(shù)組元素,如果大于,那么不做操作..反之~~~
        if (dataArray[i]<dataArray[i-1]) {
            
            temp = dataArray[i];
            
            //找到合適位置,插入有序表中
            for (j = i-1 ; dataArray[j] > temp; j--) {
                
                dataArray[j+1] = dataArray[j];
                NSLog(@"%@",dataArray);//打印每一次元素移動之后,數(shù)組的變化情況(需要斷點查看)

            }
            
            dataArray[j+1] = temp;
            
            NSLog(@"%@",dataArray);//打印每一次元素插入有序表中之后數(shù)組的變化(需要斷點打印)


        }
        
    }
    
    NSLog(@"%@",dataArray);//排序完成打印數(shù)組(需要斷點查看)

}



直接插入排序算法代碼過程部分講解


第一次遍歷( i = 1 , j= 0,temp = nil )

  • 第一步,判斷dataArray[1]和dataArray[0],因為5> 0,所以不走if里面的所以條件,也就是可以這么說,現(xiàn)在5已經(jīng)插入了有序表中,有序表為{0,5}(假裝有圖片,不對,是假裝有有序表...);現(xiàn)在的數(shù)組沒有發(fā)生改變,為{0,5,3,4,6,2};跳出第一遍循環(huán).
第一遍歷完成之后,數(shù)組未發(fā)生任何變化

第二次遍歷( i = 2 , j= 0,temp = nil )

  • 第一步,判斷dataArray[2]和dataArray[1],因為3< 5,所以走if里面的所有代碼.

  • 第二步,if里面的代碼,首先把dataArray[2]賦值給temp,所以temp = 3;接下來就是for循環(huán)插到有序表表{0,5}中,j = 1,for循環(huán)的條件dataArray[j] > temp,即為5> 3,條件成立. dataArray[3] = dataArray[2] = 5 ; 接著j-- , j = 0, 判斷for循環(huán)的條件dataArray[j] > temp,即為0> 3,條件不成立.跳出循環(huán).dataArray[j+1] = dataArray[1] = 3,這次的插入操作就完成了.插入操作完成的數(shù)組為{0,3,5,4,6,2};控制打印如下.


    數(shù)組元素3完成插入操作之后的打印信息
往后的數(shù)組元素4以及數(shù)組元素2都需要做插入移動操作,數(shù)組元素6不需要做操作,往后的步驟和上面的步驟類似.我就不做一一詳細(xì)的講解了.

各位看官,在查看上面的代碼之前 , 你需要做的一件事情,那就是準(zhǔn)備好一張紙??和一支筆??,來記錄每一次的變化.這樣才能更好的了解直接插入排序算法的全過程.就如同這樣....(書寫請無視,謝謝??..)

演算過程


最后附上OC版的Demo,各位看官自行斷點查看,如果有任何疑問請在評論去回復(fù),謝謝.

-->直接插入排序算法Demo??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轴猎,一起剝皮案震驚了整個濱河市嵌莉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捻脖,老刑警劉巖锐峭,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異可婶,居然都是意外死亡沿癞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門扰肌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抛寝,“玉大人,你說我怎么就攤上這事曙旭〉两ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵桂躏,是天一觀的道長钻趋。 經(jīng)常有香客問我,道長剂习,這世上最難降的妖魔是什么蛮位? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鳞绕,結(jié)果婚禮上失仁,老公的妹妹穿的比我還像新娘。我一直安慰自己们何,他們只是感情好萄焦,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般拂封。 火紅的嫁衣襯著肌膚如雪茬射。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天冒签,我揣著相機與錄音在抛,去河邊找鬼。 笑死萧恕,一個胖子當(dāng)著我的面吹牛刚梭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊鸥,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼望浩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惰说?” 一聲冷哼從身側(cè)響起磨德,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吆视,沒想到半個月后典挑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡啦吧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年您觉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授滓。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡琳水,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出般堆,到底是詐尸還是另有隱情在孝,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布淮摔,位于F島的核電站私沮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏和橙。R本人自食惡果不足惜仔燕,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魔招。 院中可真熱鬧晰搀,春花似錦、人聲如沸办斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俄周。三九已至吁讨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峦朗,已是汗流浹背建丧。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留波势,地道東北人翎朱。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像尺铣,于是被迫代替她去往敵國和親拴曲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • 概述:排序有內(nèi)部排序和外部排序凛忿,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序澈灼,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序店溢,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序叁熔,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,167評論 0 52
  • 數(shù)據(jù)結(jié)構(gòu)與算法--排序之冒泡著蛙、選擇删铃、插入、希爾 我們關(guān)注的主要對象是重新排列數(shù)組元素的算法册踩,每個元素都有一個主鍵泳姐,...
    sunhaiyu閱讀 1,123評論 2 12
  • 重男輕女,有我看來暂吉,是中國文化最大的毒瘤胖秒,沒有之一。 最恐怖的是慕的,在中國最為重男輕女的阎肝,往往是同為女性的奶奶和媽媽...
    朱若霞閱讀 540評論 5 3
  • 時間在12年,那時還是小學(xué)五年級沛硅,對這個世界的認(rèn)知開始有了屬于自己的見解眼刃,每天過著固定的生活。夏日炎炎摇肌,操場上的地...
    尕德古閱讀 407評論 0 0