資料結構與演算法之路 6(排序)

2021-09-20 21:11:31 字數 1919 閱讀 1391

一、排序方法與複雜度歸類

(1)幾種最經典、最常用的排序方法:氣泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。

(2)複雜度歸類

氣泡排序、插入排序、選擇排序 o(n^2)

快速排序、歸併排序 o(nlogn)

計數排序、基數排序、桶排序 o(n)

二、如何分析乙個「排序演算法」?

<1>演算法的執行效率

最好、最壞、平均情況時間複雜度。

時間複雜度的係數、常數和低階。

比較次數,交換(或移動)次數。

<2>排序演算法的穩定性

穩定性概念:如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。

穩定性重要性:可針對物件的多種屬性進行有優先順序的排序。

舉例:給電商交易系統中的「訂單」排序,按照金額大小對訂單資料排序,對於相同金額的訂單以下單時間早晚排序。用穩定排序演算法可簡潔地解決。先按照下單時間給訂單排序,排序完成後用穩定排序演算法按照訂單金額重新排序。

<3>排序演算法的記憶體損耗

原地排序演算法:特指空間複雜度是o(1)的排序演算法。

三、氣泡排序

氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足就讓它倆互換。

穩定性:氣泡排序是穩定的排序演算法。

空間複雜度:氣泡排序是原地排序演算法。

時間複雜度:

最好情況(滿有序度):o(n)。

最壞情況(滿逆序度):o(n^2)。

平均情況:

「有序度」和「逆序度」:對於乙個不完全有序的陣列,如4,5,6,3,2,1,有序元素對為3個(4,5),(4,6),(5,6),有序度為3,逆序度為12;對於乙個完全有序的陣列,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,稱作滿有序度;逆序度=滿有序度-有序度;氣泡排序、插入排序交換(或移動)次數=逆序度。

最好情況下初始有序度為n*(n-1)/2,最壞情況下初始有序度為0,則平均初始有序度為n*(n-1)/4,即交換次數為n*(n-1)/4,因交換次數《比較次數《最壞情況時間複雜度,所以平均時間複雜度為o(n^2)。

四、插入排序

插入排序將陣列資料分成已排序區間和未排序區間。初始已排序區間只有乙個元素,即陣列第乙個元素。在未排序區間取出乙個元素插入到已排序區間的合適位置,直到未排序區間為空。

空間複雜度:插入排序是原地排序演算法。

時間複雜度:

最好情況:o(n)。

最壞情況:o(n^2)。

平均情況:o(n^2)(往陣列中插入乙個數的平均時間複雜度是o(n),一共重複n次)。

穩定性:插入排序是穩定的排序演算法。

五、選擇排序

選擇排序將陣列分成已排序區間和未排序區間。初始已排序區間為空。每次從未排序區間中選出最小的元素插入已排序區間的末尾,直到未排序區間為空。

空間複雜度:選擇排序是原地排序演算法。

時間複雜度:(都是o(n^2))

最好情況:o(n^2)。

最壞情況:o(n^2)。

平均情況:o(n^2)。

穩定性:選擇排序不是穩定的排序演算法。

// 氣泡排序

public void bubblesort(int a)

}if (!flag) break; // 沒有資料交換,提前退出

}}//插入排序

public static void insertionsort(int a)

for (int i = 1; i < len; i++) else

}a[j + 1] = val;}}

//選擇排序

public static void selectionsort(int ar)

}ar[con] = ar[i];

ar[i] = val;

}}

資料結構筆記(6)排序

基於比較的排序 前提 選擇排序 演算法 資料移動是最少的 每次交換都會改變兩個陣列元素的值,選擇排序用了n次交換。交換次數和陣列的大小是線性關係。實現 void choosesort int a,int n 交換元素 int tmp a j a j a min a min tmp 更新最小元的資訊,...

資料結構與演算法(九)排序

演算法 時間複雜度 平均 時間複雜度 最壞 時間複雜度 最好 空間複雜度 穩定性氣泡排序 o n 2 o n 2 o n o 1 穩定選擇排序 o n 2 o n 2 o n 2 o 1 不穩定插入排序 o n 2 o n 2 o n o 1 穩定希爾排序 o nlogn o n 2 o n o 1...

資料結構與演算法 四 排序

def heap sort li def heapfly li start len li 2 1 獲取最後乙個葉子節點的父節點 for nod in range start,1,1 left 2 nod 1 right min left 1,len li 1 temp left if li left...