各種排序演算法時間複雜度及穩定性

2022-09-11 13:12:27 字數 1582 閱讀 7451

如下表:

每次將乙個待排序的資料,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部資料插入完成。

先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的資料進行直接插入排序,因此可以形象的稱希爾排序為「跳著插」。

通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就「沉」到最後面了。重複n次即可以使陣列有序。

氣泡排序改進1:在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷是否要繼續迴圈。

氣泡排序改進2:記錄某次遍歷時最後發生資料交換的位置,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。

「挖坑填數+分治法」,首先令i =l; j = r; 將a[i]挖出形成第乙個坑,稱a[i]為基準數。然後j--由後向前找比基準數小的數,找到後挖出此數填入前乙個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前乙個坑a[j]中。重複進行這種「挖坑填數」直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將陣列分成二部分再分別重複上述步驟就完成了排序。

陣列分成有序區和無序區,初始時整個陣列都是無序區,然後每次從無序區選乙個最小的元素直接放到有序區的最後,直到整個陣列變有序區。

6.1、二叉堆定義:

二叉堆是完全二叉樹或近似完全二叉樹。二叉堆滿足兩個特性:

(1)父結點的鍵值總是大於或者等於(小於或者等於)任何乙個子節點的鍵值;

(2)每個結點的左子樹和右子樹都是乙個二叉堆;

當父結點的鍵值總是大於或者等於任何乙個子節點的鍵值時為大根堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為小根堆;

6.2、堆的儲存:

一般都用陣列來表示堆,i結點的父結點下標就為(i-1)/2.它的左右子節點的下標分別為2*i+1和2*i+2.

6.3 排序思想

基本思想:

1.首先將待排序的陣列構造成乙個大根堆,此時,整個陣列的最大值就是堆結構的頂端

2.將頂端的數與末尾的數交換,此時,末尾的數為最大值,剩餘待排序陣列個數為n-1

3.將剩餘的n-1個數再構造成大根堆,再將頂端數與n-1位置的數交換,如此反覆執行,便能得到有序陣列

具體排序過程可見

6.4、應用

尋找m個數中的前k個最小的數並保持有序;

時間複雜度:o(k)[建立k個元素最大堆的時間複雜度] +(m-k)*log(k)[對剩餘m-k個資料進行比較並每次對最大堆進行從新最大堆化]

歸併排序主要分為兩步:分數列(divide),每次把數列一分為二,然後分到只有兩個元素的小數列;合數列(merge),合併兩個已經內部有序的子串行,直至所有數字有序。用遞迴可以實現。

常用排序演算法穩定性 時間複雜度

首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資料其在序列中的先後位置順序與排序後它們兩個先後位置順序相同。再簡單具體一點,如果a i a j,ai 原來在 aj 位置前,排序後 ai 仍然 是在 aj 位置前。下面我們分析一下穩定性的好處 1 如果排序演算法是穩定的,那...

排序演算法時間複雜度 空間複雜度 穩定性整理

涉及排序演算法包括 簡單選擇排序 直接插入排序 希爾排序 歸併排序 氣泡排序 快速排序 堆排序 基數排序 時間複雜度 快些以nlogn的速度歸隊 此句表示時間複雜度為o nlogn 的排序,快 表示快速排序,些 表示希爾排序,歸 表示歸併排序,隊 表示堆排序,其他排序均為o n 特殊的基數排序為o ...

各種排序演算法的穩定性和時間複雜度小結

各種排序演算法的穩定性和時間複雜度小結 收藏 選擇排序 快速排序 希爾排序 堆排序不是穩定的排序演算法,氣泡排序 插入排序 歸併排序和基數排序是穩定的排序演算法。排序法 平均時間 最差情形 穩定度 額外空間 備註 冒泡 o n2 o n2 穩定 o 1 n小時較好 交換 o n2 o n2 不穩定 ...