演算法 排序1

2021-09-03 01:28:42 字數 2349 閱讀 9094

如何分析乙個排序演算法

排序演算法的執行效率

排序演算法的記憶體消耗

排序演算法的穩定性

三種穩定排序演算法

氣泡排序

//氣泡排序

public

void

bubblesort

(int

list)}if

(flag)

}}

在上述**中,我們新增了乙個標識變數 flag。每次冒泡開始前設定 flag 的值為 true,在冒泡的過程中,如果發生元素交換,就改變 flag 值為 flase。則,冒泡結束的時候,如果 flag == true 說明本次冒泡沒有發生元素交換,說明陣列已經有序,可以直接終止後續冒泡,提高了冒泡演算法的執行效率。

冒泡排過程中只會交換相鄰兩個元素的位置,只需要常量級別的臨時記憶體空間,所以空間複雜度為 o(1),是原地排序。在氣泡排序中,如果兩個元素的值相同,那麼我們不進行交換,則該排序也是穩定性排序。

氣泡排序最好時間複雜度為 o(n),最壞時間複雜度為 o(n^2),那麼怎麼分析平均時間複雜度呢。按照上述氣泡排序**,由於有了 flag 標識變數,就導致了冒泡的次數小於等於 n 次,而最終決定冒泡次數的是元素的有序度和無無序度。

有序度:陣列中具有有序關係的元素對的個數。即:a[i] <= a[j],i < j。

逆序度:陣列中具有無序關係的元素對的個數。即:a[i] > a[j],i < j。

舉例:在陣列 [1,3,2,6,5] 中,有序度為 8:(1,3)(1,2)(1,6)(1,5)(3,6)(3,5)(2,6)(2,5);逆序度為 2:(3,2)(6,5)。

在有序陣列 [1,2,3,5,6] 中,有序度為 10,也叫做滿有序度。

總結規律:在乙個待排序陣列中,滿有序度 = 有序度 + 逆序度。滿有序度 =n*(n-1)/2。下面給出陣列 [4,5,6,3,2,1] 冒泡過程中有序度和無序度的變化。

冒泡次數

冒泡結果

有序度交換次數

初始狀態

[4,5,6,3,2,1]30

第1次冒泡

[4,5,3,2,1,6]63

第2次冒泡

[4,3,2,1,5,6]93

第3次冒泡

[3,2,1,4,5,6]123

第4次冒泡

[2,1,3,4,5,6]142

第5次冒泡

[1,2,3,4,5,6]151

我們觀察得出結論,元素每交換一次,有序度增加一次。那麼得出最好情況下,需要交換 0 次,最壞的情況下,需要交換 n*(n-1)/2 次,取個中間值 n*(n-1)/4。在排序過程中,比較次數遠遠大於交換次數,但是總的時間複雜度不會高於 o(n^2),所以平均時間複雜度為 o(n^2)。

插入排序

//插入排序

public

static

void

insertsort

(int

list)

else

} list[j +1]

= item;

}}

從上述**中看出,插入排序並不需要額外的空間,所以是原地排序。在擦插入排序中,對於相等的元素不進行交換位置,則也是穩定的排序。插入排序的時間複雜度,對於乙個有序的陣列,只需遍歷一遍陣列,最好時間複雜度為 o(n),對於逆序的陣列,相當於執行便利陣列 n 次,每次都在陣列前面插入元素,則最壞時間複雜度為 o(n^2)。平均時間複雜度,在陣列中插入乙個元素的平均時間複雜度為 o(n),那麼執行 n 次,平均時間複雜度就是 o(n^2);

選擇排序

//選擇排序

public

static

void

selectsort

(int

list)

}int item = list[index]

; list[index]

= list[i]

; list[i]

= item;

}}

選擇排序只需要常量級別的臨時記憶體空間,所以空間複雜度為 o(1)。最好時間複雜度為 o(n),最壞時間複雜度為 o(n2),平均時間複雜度與插入排序分析方法一樣,也是o(n2)。由於選擇排序並非相鄰元素交換位置,所以不是穩定排序。

比較插入排序和氣泡排序

氣泡排序和插入排序無論如何優化,氣泡排序元素交換的次數和插入排序元素的移動次數都是等於元資料的逆序度。但是從**實現上,氣泡排序元素交換時的**複雜度高於插入排序元素移動時的**複雜度,所以從效能上,插入排序的執行效率要高於氣泡排序。

總結初入演算法學習,必是步履蹣跚,一路磕磕絆絆跌跌撞撞。看不懂別慌,也別忙著總結,先讀五遍文章先,無他,唯手熟爾~

與諸君共勉

排序 排序演算法1

所謂氣泡排序就是,一組資料,以遞增的順序來說明,從第乙個數data 0 開始,依次和後面的資料比較大小,如果data 0 大於當前位置上的數就和這個數交換位置並繼續和後面的數相比,如果遇到比自己大的數了,就不交換 下一次開始的位置是data 1 然後依次往後推。void myswap int num...

排序演算法 1 選擇排序演算法

這篇部落格分為兩個部分 選擇排序演算法基本思想 實現與解析 由於這個排序演算法比較簡單,因此這篇博文就不做過多解釋了 一.選擇排序演算法基本思想 1 選擇排序 小到大排序 1.遍歷所有未排序的元素 找到最小的那個元素 2.將這個元素與未排序序列的第乙個元素交換位置 3.當剩下乙個元素時 排序結束 o...

排序演算法 1

二 高階排序演算法 高階排序演算法中我們將只介紹這一種,同時也是目前我所知道 我看過的資料中 的最快的。它的工作看起來仍然象乙個二叉樹。首先我們選擇乙個中間值middle程式中我們使用陣列中間值,然後 把比它小的放在左邊,大的放在右邊 具體的實現是從兩邊找,找到一對後交換 然後對兩邊分別使 用這個過...