【數據結構】排序——內部排序
內部排序:在排序期間元素全部存放在內存中的排序
排序算法一覽
各算法簡述
- 插入排序
基本思想:每次將一個帶排序的記錄按其關鍵字的大小插入到前面已經排好的序列中,直到全部記錄插入完成。
1、直接插入排序
基本思想:將整個序列划分為有序和無序序列——>每次從無序序列中取出一個元素,然后在有序序列中遍歷,需找合適的位置將該元素插入有序序列中——>自插入的位置開始有序序列向后移動一個位置。
適用於 順序存儲和鏈式存儲
2、折半插入排序
基本思想:確定折半插入排序的范圍——>對其進行類似於二分法定界的放手不斷縮小范圍——>對數據進行移動,對帶排序進行插入。
該算法比較次數僅與表中元素個數有關
適用於 順序存儲
3、希爾排序
基本思想:將帶排序表分割成若干形如L[i,i+d,i+2d...]的子表對各個子表分別進行直接插入排序,縮小增量d,重復上述操作,直到d=1為止。
適用於 順序存儲
- 交換排序
基本思想:根據序列中兩個元素關鍵字的比較結果來對這兩個記錄在序列中的位置
1、冒泡排序
基本思想:從前往后(或從后往前)兩兩比較相鄰元素的值,若為逆序,擇機哦啊還他們,直到序列比較完——>將最小(最大)元素交換到帶排序序列的第一個位置(最后一個位置)——>進行下一趟冒泡時,前一趟確定的最小(或最大)元素不再參與比較,每趟冒泡的結果是把序列中的最小(或最大)元素放到了序列的最終位置——>如果某一趟排序過程中未發生“交換”,則算法可提前結束。
適用於 順序存儲
2、快速排序:目前基於比較的內部排序方法中最好的方法
基本思想:選取一個元素作為樞軸,一次樞軸為界分為兩個部分,左面小於該樞軸,右面大於該樞軸值——>再對這兩個部分分別遞歸的進行上述步驟
該算法的運行時間與划分是否對稱有關
適用於 順序存儲
- 選擇排序
基本思想:每一趟(如第i趟)在后面n-i+1(i=1,2...n-1)個帶排序元素中選取關鍵字最小的元素,作為有序子序列的第i個元素,直到n-1趟做完,帶排序元素只剩下1個,就不用再選。
1、簡單選擇排序
基本思想:將表分為有序和無序兩個部分,每次從無序部分中選取最小的元素,然后將其放入有序部分中。
該算法元素間比較的次數與序列的初始狀態無關
適用於 順序存儲
2、堆排序
小根堆(根>左、右)大根堆(根 <左、右)
基本思想:建堆:按照大根堆(或小根堆)的規則建立相應的二叉樹,那么根結點一定是最大值(或最小值)——>調整堆:當根結點輸出后,整棵二叉樹可能被破壞,這時根據相應的建堆規則,自底向上,自左向右,進行父結點與子節點交換以滿足建堆規則。
- 歸並排序
基本思想:每次選定相應的元素分別合成一個新的有序表
(2路歸並)
適用於 順序表
- 基數排序
基本思想:不基於比較和移動的排序,而基於關鍵字各位的大小進行排序。
小結
- 若n較小,可采用直接插入排序或簡單選擇排序。
- 若n較大,可采用快速排序、堆排序或歸並排序
- 若n很大,記錄的關鍵字位數較少且可以分解,采用基數排序最好。
- 記錄本身信息量較大時,為避免耗費大量時間移動記錄,可用鏈表作為存儲結構。
- 記錄本身信息量較大時,用簡單選擇排序較好。
- 初始狀態關鍵字基本有序,則用直接插入排序或冒泡排序。
- 帶排序的關鍵字隨機分布,快速排序的平均時間最短。
- 要求排序穩定且時間復雜度為
,則可用歸並排序。
注:此文為日常學習專業課的筆記,后期會不斷的增刪改一些部分,包括相關算法的代碼實現等。如有錯誤,還望多多指出,謝謝🙏