資料結構之內部排序演算法總結筆記

2022-07-10 03:00:07 字數 2462 閱讀 6490

內部排序演算法

排序的基本概念:

把一組無序的資料元素按照關鍵字值遞增(或遞減)的順序重新排列。

一、插入排序

思想:將序列分為【有序段】與【無序段】兩段,然後依次將【無序段】中的元素插入到【有序段】的正確位置。尋找元素應插入的位置可用【直接】和【折半】兩種方式進行查詢。

對應演算法:直接插入排序折半插入排序

以上兩種演算法的不同點:尋找插入位置方式不同。

特殊的插入排序:希爾排序(shell sort)又稱縮小增量排序

思想:提供乙個增量序列(遞減),每次根據增量序列將待排序的記錄劃分為若干組,然後分別對這若干組採用插入排序進行排序。當經過幾次分組排序之後,記錄的排列已經基本有序,這個時候再對所有的記錄直接插入排序。

二、交換排序

1、氣泡排序

思想:將序列分為【有序段】與【無序段】兩段,將【無序段】的相鄰元素進行比較,若逆序,則交換,最後將最右邊的元素放入有序段。最終達到有序化。

2、 基於交換排序的快速排序

思想:在待排序序列中選取乙個記錄作為基準值,然後從待排序序列左右兩端開始,逐漸向中間靠攏,交替與基準值進行比較,交換。每次交換,當右側記錄小基準值,則將其與基準值交換,使其移到基準值的左側;反之,當左側記錄大於基準值,則將其與基準值交換,使其移到基準值的右側。最終根據基準值將序列分為左右兩個子串行,然後對這兩個子串行重複上面步驟。

三、選擇排序

1、簡單選擇排序

思想:從待排序的序列中選取出最小(最大)的元素作為有序序列新的元素。

2、 基於選擇的堆排序

思想:將待排序的記錄序列構造乙個堆,然後選出並移走該堆得最值,然後將剩餘的記錄再調節成堆,以此類推,知道堆中只有乙個記錄為止,每個記錄出堆得順序就是乙個有序序列。

堆:由n個元素組成的序列,當且僅當滿足如下關係時,稱之為堆。

堆可以被看做是以k1為根的乙個完全二叉樹。

四、歸併排序

思想:將乙個具有n個待排序記錄的序列堪稱是n個長度為1的有序列,然後進行兩兩歸併,得到n/2個長度為2的有序序列,在進行兩兩歸併,得到n/4個長度為4的有序序列,如此重複,直到得到乙個長度為n的有序序列為止。

五、基數排序

1、 鏈式基數排序

思想:按照關鍵字位進行「分配」和「收集」。

關鍵字:分配、收集

適用情況:待排序的記錄數目較多,但其關鍵字位數較少,且關鍵字每一位的基數相同的情況。

六、各種排序演算法的比較

1、穩定性角度

穩定排序:直接插入排序、氣泡排序、歸併排序、基數排序

不穩定排序:shell排序、快速排序、簡單選擇排序、堆排序

2、 選擇排序演算法時考慮的因素:

(1)待排序的記錄數目n的大小;

(2)記錄本身資料量的大小,也就是記錄中除關鍵碼外的其他資訊量的大小;

(3)關鍵碼的結構及其分布情況;

(4)對排序穩定性的要求。

3、 一些結論:

(1)若n較小(例如n<50),可採用直接插入排序、氣泡排序或簡單選擇排序。如果記錄中的資料較多,移動較費時的,應採取簡單選擇排序法。

(2)若記錄的初始狀態已經按關鍵碼基本有序,則選用直接插入排序或氣泡排序法為宜。

(3)若n較大,則應採用改進排序方法,如快速排序、堆排序或歸併排序法。這些排序演算法的時間複雜度均為o(nlog2n),但就平均效能而言,快速排序被認為是目前基於比較記錄關鍵碼的內部排序中最好的排序方法,但遺憾的是,快速排序在最壞情況下的時間複雜度是o(n2),堆排序與歸併排序的最壞情況時間複雜度仍為o(nlog2n)。堆排序和快速排序法都是不穩定的排序。若要求穩定排序,則可選用歸併排序。

(4)基數排序可在o (d×n) 時間內完成對n個記錄的排序,d是指單邏輯關鍵碼的個數,一般遠少於n。但基數排序只適用於字串和整數這類有明顯結構特徵的關鍵碼。

(5)前面討論的排序演算法,除基數排序外,都是在順序儲存上實現的。當記錄本身的資訊量很大時,為避免大量時間用在移動資料上,可以用鍊錶作為儲存結構。插入排序和歸併排序都易在鍊錶上實現,但有的排序方法,如快速排序和堆排序在鍊錶上卻很難實現。

綜上所述,每一種排序方法各有特點,沒有哪一種是絕對最優的。應根據具體情況選擇合適的排序方法,也可以將多種方法結合起來使用。

下面是以上各種演算法編寫的測試原始碼,僅供交流:

編譯環境是vc++ 6.0,整個專案檔案均打包在裡面。

資料結構之內部排序個人總結

內部排序簡單來說,就是在記憶體中存放待排序資料元素進行排序的過程。內部排序簡單分為 插入排序,快速排序,選擇排序,歸併排序,基數排序。一 插入排序 時間效率 o n2 空間效率 n 1 演算法穩定,鍊錶結構效率更高。時間效率 o n2 空間效率 n 1 演算法穩定,鍊錶結構無法進行 折半 如圖 3 ...

資料結構之內部排序 快速排序

ide pycharm python版本 python3.x 演算法分類 內部排序 交換類排序 快速排序 待排序記錄序列中選取乙個記錄為樞軸,其關鍵字為k1 k 1,然後將其餘關鍵字小於k1 k 1的移到前面,大於k1 k 1的移到後面,結果是待排序記錄分為兩個子表,最後將關鍵字k1 k 1插到中間...

資料結構中內部排序總結

1 首先說乙個概念 穩定排序與非穩定排序 如果乙個序列中原來相同的元素,排序完成後,仍然保持著原來的順序,那麼就成為穩定排序,反之就是非穩定排序。2 1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組...