排序學習總結(待續)

2021-05-23 19:51:20 字數 3270 閱讀 3252

首先來說說排序的分類。

1. 插入排序---直接插入排序、折半插入排序、希爾排序;

2. 交換排序---氣泡排序、快速排序;

3. 選擇排序---直接選擇排序、堆排序;

3. 歸併排序;

4. 分配排序---桶排序、基數排序;

5. 外部排序。

內部排序和外部排序的概念:在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內、外存交換,則稱之為內部排序;反之,若排序過程中要進行資料的內、外存交換,則稱之為外部排序。

需要注意的是:

(1)內排序適用於記錄個數不很多的小檔案;

(2)外排序則適用於記錄個數太多,不能一次將其全部記錄放入記憶體的大檔案。

直接插入排序

有乙個比喻非常恰當:插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

時間複雜度o(n2)空間複雜度o(1),穩定性:插入排序是穩定的,因為具有同一值的元素必然插在具有同一值的前乙個元素的後面,即相對次序不變。

插入排序是一種簡單的排序方法,他不僅適用於順序儲存結構(陣列),而且適用於鏈結儲存結構,不過在鏈結儲存結構上進行直接插入排序時,不用移動元素的位置,而是修改相應的指標。

希爾(shell)排序

希爾排序(shell sort)又稱為「縮小增量排序」。是2023年由d.l.shell提出來的。該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

時間複雜度o(n2)空間複雜度o(1),穩定性:希爾排序是不穩定的,大家可以寫個例子,陣列當中兩個數相等,無法保證幾輪排序之後兩個數的相對位置不變,因此也無法保證穩定性。

希爾排序在時間效能上優於直接插入排序。原因如下:

(1)

當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。

(2) 當n值較小時,n和n2

的差別也較小,即直接插入排序的最好時間複雜度o(n)和最壞時間複雜度0(n2)差別不大。

(3) 在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di

逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1

作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插人排序有較大的改進。

快速排序

快速排序是一種交換排序,採用分治演算法,其基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

快速排序的基本思想如下:

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

①分解:

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys

其中low≤pivotpos≤high。

②求解:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

最壞時間複雜度o(n2),最好時間複雜度o(logn),快速排序屬於穩定排序。

選擇排序

選擇排序(selection sort)的基本思想是:每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。

常用的選擇排序方法有直接選擇排序和堆排序。

直接選擇排序

第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r[i..n](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[i]交換,使r[1..i]和r[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

直接選擇排序的平均時間複雜度為o(n2),並且是不穩定的。

排序演算法比較

(1)平方階(o(n2))排序

一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序;

(2)線性對數階(o(nlgn))排序

如快速、堆和歸併排序;

(3)o(n1+£)階排序

£是介於0和1之間的常數,即0<£<1,如希爾排序;

(4)線性階(o(n))排序

如桶、箱和基數排序。

不同條件下,排序方法的選擇

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。

當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插入,應選直接選擇排序為宜。

(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

(3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或歸併排序。

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;

堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。

若要求排序穩定,則可選用歸併排序。

排序演算法總結 待續

所有的排序演算法,預設 小的在前 大的在後 演算法複雜度 比較相鄰兩個元素,若第乙個比第二個大 就交換順 每一對都交換順序,經過一輪比較之後,最後乙個元素就是最大 每一輪可以確定乙個最大的數.需要 陣列個數次 氣泡排序原理 1.比較相鄰兩個元素,若第乙個比第二個大 就交換順序 2.每一對都交換順序,...

Linux學習總結 未完待續

linux學習總結 1.使用者管理部分 a,使用者與組配置檔案 a1.與使用者和組相關的配置檔案 passwd,shadow group,gshadow a2.超級許可權控制sudo的配置檔案 etc sudoers a3.新增使用者規則檔案 etc skel 預設啟動檔案 etc login.de...

vimtutor總結(待續)

終端中輸入vimtutor即可進入教程。該教程介紹了一些必要的vim基本命令,掌握好這些命令基本上就能正常使用vim了。本篇文章是對vimtutor的整理和總結,並加入了一些補充內容。進入 vim 檔名 vimtutor重新進入vim教程 退出 正常模式下,輸入 q 即可退出 這種退出方式不會儲存所...