在我的部落格對氣泡排序,直接插入排序,直接選擇排序,希爾排序,歸併排序,快速排序和堆排序
有網友提議到這本《morewindows白話經典演算法之七大排序》電子書講解細緻用來平時學習是非常好的,但是頁數有22頁,不太合適做面試前的複習資料。因此在這裡將這七種常用的排序方法進行下總結,以便大家更好的複習這些經典的排序演算法,為面試打下良好的基礎。
首先回顧下各種排序的主要思路:
一.氣泡排序
氣泡排序主要思路是:
通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就「沉」到最後面了。重複n次即可以使陣列有序。
氣泡排序改進1:在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷是否要繼續迴圈。
氣泡排序改進2:記錄某次遍歷時最後發生資料交換的位置,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。
二.直接插入排序
直接插入排序主要思路是:
每次將乙個待排序的資料,插入到前面已經排好序的序列之中,直到全部資料插入完成。
三.直接選擇排序
直接選擇排序主要思路是:
陣列分成有序區和無序區,初始時整個陣列都是無序區,然後每次從無序區選乙個最小的元素直接放到有序區的最後,直到整個陣列變有序區。
上面這三種排序都是非常簡單的,下面這四種排序略有難度,希望讀者能多多實踐以加深理解。
四.希爾排序
希爾排序主要思路是:
先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的資料進行直接插入排序,因此可以形象的稱希爾排序為「跳著插」
五.歸併排序
歸併排序主要思路是:
當乙個陣列左邊有序,右邊也有序,那合併這兩個有序陣列就完成了排序。如何讓左右兩邊有序了?用遞迴!這樣遞迴下去,合併上來就是歸併排序。
六.快速排序
快速選擇排序主要思路是:
「挖坑填數+分治法」,首先令i =l; j = r; 將a[i]挖出形成第乙個坑,稱a[i]為基準數。然後j--由後向前找比基準數小的數,找到後挖出此數填入前乙個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前乙個坑a[j]中。重複進行這種「挖坑填數」直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將陣列分成二部分再分別重複上述步驟就完成了排序。
七.堆排序
堆排序主要思路用張圖示來表示更好:
可見堆排序的難點就在於堆的的插入和刪除。
堆的插入就是——每次插入都是將新資料放在陣列最後,而從這個新資料的父結點到根結點必定是乙個有序的數列,因此只要將這個新資料插入到這個有序數列中即可。
堆的刪除就是——堆的刪除就是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最小的,如果父結點比這個最小的子結點還**明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點開始將乙個資料在有序數列中進行「下沉」。
因此,堆的插入和刪除非常類似直接插入排序,只不是在二叉樹上進行插入過程。所以可以將堆排序形容為「樹上插」
再用一張圖表示下這七種常用的排序方法的關係。
好了,七種常用的排序方法就總結到這了,相信大家上機寫下**再看下這張圖必定會印象深刻。
在準備面試資料時可以列印最後這張圖,這樣就能在面試前快速的複習一下了,祝大家面試順利,拿到自己滿意的offer。
超跑開起來~~~~~~~
白話經典演算法系列
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆的定義二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都...
排序演算法 白話經典排序演算法
1.白話經典演算法系列之一 氣泡排序的三種實現 2.白話經典演算法系列之二 直接插入排序的三種實現 3.白話經典演算法系列之三 希爾排序的實現 4.白話經典演算法系列之四 直接選擇排序及交換二個資料的正確實現 5.白話經典演算法系列之五 歸併排序的實現 6.白話經典演算法系列之六 快速排序 快速搞定...
經典白話演算法之桶排序
最快最簡單的排序 桶排序 在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照 排序,電子郵箱中的郵件按照時間排序 總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下排序演算法。首先出場的我們的主人公小哼,上...