1.幾種最經典、最常用的排序方法:氣泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。
2.複雜度歸類
氣泡排序、插入排序、選擇排序 o(n2)
快速排序、歸併排序 o(nlogn)
計數排序、基數排序、桶排序 o(n)
1.演算法的執行效率
(1) 最好、最壞、平均情況時間複雜度。
(2) 時間複雜度的係數、常數和低階。
(3) 比較次數,交換(或移動)次數。
2.排序演算法的穩定性
(1) 穩定性概念:如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。
(2) 穩定性重要性:可針對物件的多種屬性進行有優先順序的排序。
舉例:給電商交易系統中的「訂單」排序,按照金額大小對訂單資料排序,對於相同金額的訂單以下單時間早晚排序。用穩定排序演算法可簡潔地解決。先按照下單時間給訂單排序,排序完成後用穩定排序演算法按照訂單金額重新排序。
3.排序演算法的記憶體損耗
原地排序演算法:特指空間複雜度是o(1)的排序演算法。
氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足就讓它倆互換。
穩定性:氣泡排序是穩定的排序演算法。
空間複雜度:氣泡排序是原地排序演算法。
時間複雜度:
1.最好情況(滿有序度):o(n)。
2.最壞情況(滿逆序度):o(n2)。
3.平均情況:
「有序度」和「逆序度」:對於乙個不完全有序的陣列,如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(n2)。
// 氣泡排序,a 表示陣列,n 表示陣列大小
插入排序將陣列資料分成已排序區間和未排序區間。初始已排序區間只有乙個元素,即陣列第乙個元素。在未排序區間取出乙個元素插入到已排序區間的合適位置,直到未排序區間為空。
空間複雜度:插入排序是原地排序演算法。
時間複雜度:
1.最好情況:o(n)。
2.最壞情況:o(n2)。
3.平均情況:o(n2)(往陣列中插入乙個數的平均時間複雜度是o(n),一共重複n次)。
穩定性:插入排序是穩定的排序演算法。
// 插入排序,a 表示陣列,n 表示陣列大小
private
void
insertionsort
(int
a)for(
int i =
1; i < n;
++i)
else
} a[j +1]
= value;
// 插入資料
選擇排序將陣列分成已排序區間和未排序區間。初始已排序區間為空。每次從未排序區間中選出最小的元素插入已排序區間的末尾,直到未排序區間為空。空間複雜度:選擇排序是原地排序演算法。
時間複雜度:(都是o(n2))
1.最好情況:o(n2)。
2.最壞情況:o(n2)。
3.平均情況:o(n2)。
穩定性:選擇排序不是穩定的排序演算法。
public
static
void
selectionsort
(int
a)}// 將最小值放到未排序記錄的第乙個位置
思考1選擇排序和插入排序的時間複雜度相同,都是o(n2),在實際的軟體開發中,為什麼我們更傾向於使用插入排序而不是氣泡排序演算法呢?
氣泡排序中資料的交換操作:
if(a[j]
> a[j+1]
)插入排序中資料的移動操作:
if(a[j]
> value)
else
答:從**實現上來看,氣泡排序的資料交換要比插入排序的資料移動要複雜,氣泡排序需要3個賦值操作,而插入排序只需要1個,所以在對相同陣列進行排序時,氣泡排序的執行時間理論上要長於插入排序。
思考2
我們講過,特定演算法是依賴特定的資料結構的。我們今天講的幾種排序演算法,都是基於陣列實現的。如果資料儲存在鍊錶中,這三種排序演算法還能工作嗎?如果能,那相應的時間、空間複雜度又是多少呢?
答:一般而言,考慮只能改變節點位置,氣泡排序相比於陣列實現,比較次數一致,但交換時操作更複雜;插入排序,比較次數一致,不需要再有後移操作,找到位置後可以直接插入,但排序完畢後可能需要倒置鍊錶;選擇排序比較次數一致,交換操作同樣比較麻煩。綜上,時間複雜度和空間複雜度並無明顯變化,若追求極致效能,氣泡排序的時間複雜度係數會變大,插入排序係數會減小,選擇排序無明顯變化。
氣泡排序,插入排序,選擇排序筆記
演算法原理 1 氣泡排序只會操作相鄰的兩個資料。2 對相鄰兩個資料進行比較,看是否滿足大小關係要求,若不滿足讓它倆互換。3 一次冒泡會讓至少乙個元素移動到它應該在的位置,重複n次,就完成了n個資料的排序工作。4 優化 若某次冒泡不存在資料交換,則說明已經達到完全有序,所以終止冒泡。void bubb...
氣泡排序,選擇排序,插入排序
氣泡排序,選擇排序,插入排序 小規模的檔案以及基本有序的檔案,插入排序的效能比快速排序的效能更為有效一些,實際上,插入排序通常也做快速排序實現的一部分。1 氣泡排序 packagedatastrut public classbubblesort public voidinsert longvalue...
選擇排序 , 插入排序 , 氣泡排序
編寫 include void println int array,int len 列印給定長度的陣列 printf n void swap int array,int i,int j 交換陣列中兩個位置的元素 void selectionsort int array,int len o n n 對...