一、排序方法與複雜度歸類
(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...