鐵甲依然在。 --九州
在各種演算法問題中,排序演算法是最基本的問題,貌似很多面試筆試都要問道這個=-=
。排序(
sort)
是指按照一定的規則(一般是遞增或者遞減)將資料進行排列。
常見的排序演算法有:交換(氣泡排序、快速排序),選擇(選擇排序、堆排序),插入(插入排序,shell
排序),合併。
此外還有多路歸併排序(資料量較大時,由於計算機記憶體的限制,往往不能直接將資料讀入記憶體進行操作。這次採用多路歸併的策略,將檔案劃分為幾個能夠讀入記憶體的小部分,分別讀入記憶體,之後將結果進行歸併)。
交換:氣泡排序、快速排序
選擇:選擇排序、堆排序
插入:插入排序、shell排序
1.氣泡排序(bubble sort)
氣泡排序法是所有排序演算法中最簡單、最基本的一種。其思想就是交換排序,通過交換相鄰的來達到排序的目的。動態的去想象這個過程,資料會一層一層的向上冒,蓋因此得名焉。
氣泡排序法通過多次比較和交換來實現排序,排序的流程如下(以增序為例):
(1)對陣列中的各資料,依次比較相鄰兩個元素的大小。
(2)如果前者大於後者,則交換;經過第一輪的多次排序後,便可把最小的數排好。
(3)再用同樣的方法對剩下的數進行排序,迭代至所有數排序完畢。
為了更清晰的表達氣泡排序法的執行過程,在下舉乙個例子。對於5
個整型資料
118、
101、
105、
127、
112組成的乙個無序陣列進行從小到大的排序。
初始陣列:118 101 105 127 112
一次比較:101 118 105 127 112
首先進行第一次比較,118
大於101
,故交換。
二次比較:101
105 118 127 112
進行第二次比較,118
同樣大於
105,仍然交換。
三次比較:101 105
118 127 112
進行第三次比較,118
小於127
,故不交換。
四次比較:101 105 118
112 127
進行第四次比較:交換112
和127
以上為第一次排序的過程,經過(陣列元素個數-1
)次比較的過程,實際上找出了整個陣列裡面的最大值,並將其放置在陣列的最後乙個位置,即排好了陣列的最大值。依次迭代,可以相繼排好陣列的次大值,次次大值,直至所有元素排序完畢。
值得一提的是,上述過程如果從後往前遍歷比較,那麼第一次排序排好的是陣列的最小值。
2.選擇排序法(
selection sort)
選擇排序法也是比較簡單的排序演算法,思路是在每一步中選取最小值來重新排列,從而達到排序的目的。
選擇排序法通過選擇和交換來進行排序,其排序流程如下:
(1)首先從原始陣列中找到最小的元素,將其和第乙個位置的元素交換。
(2)從剩下的n-1
個元素中找到最小的元素,將其和第二個位置的元素交換。
(3)重複上述過程,直至所有元素排序完畢。
該演算法其實就是封裝了多個求最值得過程來進行排序。
3.插入排序法(insertion sort)
插入排序發通過對未排序的資料執行逐個插入至合適的位置而完成排序的工作。
插入排序法通過比較和插入來實現排序,其排序的流程如下:
(1)首先對陣列的前兩個元素進行從小到大的排序。
(2)接著對第3
個元素與已經排好序的兩個元素比較,並插入到合適的位置。
(3)然後,將第四個元素插入到已經排好序的前3
個資料中。
(4)不斷重複上述過程,直到把最後乙個和元素插入到乙個合適的位置。
同樣,在下還是舉個例子來說明插入排序的執行過程。對於5
個整型資料
118、
101、
105、
127、
12組成的乙個無序陣列進行從小到大的排序。
初始陣列:118 101 105 127 112
一次插入:101 118 105 127 112
第一次插入,將前面兩個元素按照從小到大排序。可以理解為將第二個元素插到第乙個元素中。
二次插入:101
105 118 127 112
第二次插入,將第三個元素插入到已經排號序的前面兩個元素中,至此前面三個元素以及排號序。
三次插入:101 105 118 127 112
第三次插入,排好前面四個元素。
四次插入:101 105 118 112
127
第四次插入,完成整個陣列的排序。
針對插入排序,如果原始資料是基本有序的,效率較高。但是如果資料本身很不規則,則需要移動大量的資料,其排序效率也不是很好。
4.shell排序演算法
前面介紹的幾種演算法,雖然思路比較直觀,容易理解,但是效率不高。對於大量資料需要排序的時候,我們往往需要效率更高的演算法,shell
演算法算乙個。
shell演算法的思想來自於插入演算法,其又稱為希爾排序或者縮小增量的排序。排序流程如下:
(1) 將有n
個元素的陣列分為
n/2個數對,第
1個元素和第
n/2+1
個元素為一對。。。。。依次類推,第
i個元素和第
n/2+i
個元素為一對。
(2) 一次迴圈使每乙個數隊排好順序。
(3) 然後,再變為n/4
個序列,再次排序。
(4) 不斷重複上述過程,隨著序列減少至乙個,也就完成了整個陣列的排序。
下面用例子來具體說明shell
演算法的執行過程。
原始陣列:127 118 105 101 112 100
一次排序:101
112110
127
118105
第一次排序,首先將陣列分為6/2=3
個序列,分別是(
127,
101),(
118,
112),(
105,
100)。並對各個序列進行排序操作。
二次排序:100 101 105 112 118 127
第二次排序,將陣列分為6/4=1
(取整),此時逐個對資料比較,
按照插入排序的演算法對這個序列進行排序。
我們已經知道,如果資料本身就是基本有序的,那麼插入排序的效率會較高。shell
排序法就是不斷提高陣列的有序性,配合插入演算法提高排序的效率。
11月21日總結
功能是元素去重 刪除 序列中所有相鄰的重複元素 只保留乙個 重複元素的位置將被不重複的元素給占領,所以在使用之前 一般會將目標序列進行排序 1.只有兩個引數,且引數型別都是迭代器 iterator unique iterator it 1,iterator it 2 這種型別最為常用。其中這兩個引數...
11月30日總結
python 直譯器可以作為乙個簡單的計算器,您可以在直譯器裡輸入乙個表示式,它將輸出表示式的值。表示式的語法很直白 和 和其它語言 如pascal或c 裡一樣。例如 2 24 50 5 620 50 5 6 45.0 8 5 總是返回乙個浮點數1.6 注意 在不同的機器上浮點運算的結果可能會不一樣...
11月27日總結
函式 返回值 描述 abs x 返回數字的絕對值,如abs 10 返回 10 ceil x 返回數字的上入整數,如math.ceil 4.1 返回 5 cmp x,y 如果 x y 返回 1,如果 x y 返回 0,如果 x y 返回 1。python 3 已廢棄,使用 x y x exp x 返回...