1. 程式人生 > >各種排序的時間複雜度,空間複雜度,穩定性

各種排序的時間複雜度,空間複雜度,穩定性

穩定性指兩個相同的物件經過排序後相對位置是否變化。

複雜度指演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

一、氣泡排序:(bubble sort)

原理:

1、從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。

2、重複1號步驟,直至再也不能交換。

時間複雜度:O(n^2)

空間複雜度:O(1),不需要額外空間

穩定性:穩定

二、插入排序:(insertion sort)

原理:

1、首先從1到n-1迴圈取出一個數,令temp = i(1<= i <= n-1),將其與前面數比較,如果比它大,則不用操作

2、如果比前面一個數小,則array[i] = array[i-1],一直比下去,如果到了比它小的數,就放在該數後面一個位置

3、重複1,2號步驟,直至原數列為空。

時間複雜度:O(n^2)

空間複雜度:O(1)

穩定性:穩定

原理:

1、設陣列記憶體放了n個待排數字,陣列下標從1開始,到n結束。

2、初始化i=1

3、從陣列的第i個元素開始到第n個元素,尋找最小的元素。

4、將上一步找到的最小元素和第i位元素交換。

5、i++,直到i=n-1演算法結束,否則回到第3步

時間複雜度:O(n^2)

空間複雜度:O(1)

穩定性:不穩定

四、快速排序(quicksort)

原理:

1、設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 2、以第一個陣列元素作為關鍵資料,賦值給key,即key=A[0]; 3、從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換; 4、從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於key的A[i],將A[i]和A[j]互換; 5、重複第3、4步,直到i=j;

時間複雜度:O(

nlog n)

空間複雜度:0(logn),要為遞迴程式執行過程棧所需的輔助空間 

穩定性:不穩定

五、希爾排序:(shell sort)

原理:

1、先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分組。

2、所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序

3、然後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量

            Dn  =1,,即所有記錄放在同一組中進行直接插入排序為止,一般初次取序列一半為增量,以後每次減半,直到增量為1。

時間複雜度:O(n^1.3)

空間複雜度:0(1)

穩定性:不穩定

六、堆排序(heapsort)

n個關鍵字序列Kl,K2,…,Kn稱為(Heap),當且僅當該序列滿足如下性質(簡稱為堆性質):

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),當然,這是小根堆,大根堆則換成>=號。//k(i)相當於二叉樹的非葉子結點,K(2i)則是左子節點,k(2i+1)是右子節點

時間複雜度:O(N*logN)

空間複雜度:堆排序是就地排序,輔助空間為O(1)

穩定性:不穩定

七、歸並排序(merge sort)

時間複雜度:O(n log n

空間複雜度:O(n)

穩定性:穩定

八、桶排序(bucket sort)、基數排序(radix sort)

原理:

它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,可以合併再分桶,或者是在桶中直接排好序

時間複雜度:d個關鍵碼,關鍵碼的取值範圍為radix,則進行鏈式基數排序的時間複雜度為O(d(n+radix))

空間複雜度:O(n)

穩定性:穩定