1.學習排序演算法的思路?明確原理、掌握實現以及分析效能。
2.如何分析排序演算法效能?從執行效率、記憶體消耗以及穩定性3個方面分析排序演算法的效能。
3.執行效率:從以下3個方面來衡量
1)最好情況、最壞情況、平均情況時間複雜度
2)時間複雜度的係數、常數、低階:排序的資料量比較小時考慮
3)比較次數和交換(或移動)次數
4.記憶體消耗:通過空間複雜度來衡量。針對排序演算法的空間複雜度,引入原地排序的概念,原地排序演算法就是指空間複雜度為o(1)的排序演算法。
5.穩定性:如果待排序的序列中存在值等的元素,經過排序之後,相等元素之間原有的先後順序不變,就說明這個排序演算法時穩定的。
1.排序原理
1)氣泡排序只會操作相鄰的兩個資料。
2)對相鄰兩個資料進行比較,看是否滿足大小關係要求,若不滿足讓它倆互換。
3)一次冒泡會讓至少乙個元素移動到它應該在的位置,重複n次,就完成了n個資料的排序工作。
4)優化:若某次冒泡不存在資料交換,則說明已經達到完全有序,所以終止冒泡。
2.**實現
/**
* 氣泡排序
* @param a 待排序陣列
* @param n 陣列長度
*/public
static
void
bubblesort
(int
a,int n)
}//若本次冒泡操作未發生資料交換,則終止冒泡操作
if(tag ==
false
)break;}
}
3.效能分析1)執行效率:最小時間複雜度、最大時間複雜度、平均時間複雜度
最小時間複雜度:資料完全有序時,只需進行一次冒泡操作即可,時間複雜度是o(n)。
最大時間複雜度:資料倒序排序時,需要n次冒泡操作,時間複雜度是o(n^2)。
平均時間複雜度:通過有序度和逆序度來分析。
什麼是有序度?
什麼是逆序度?
2)空間複雜度:每次交換僅需1個臨時變數,故空間複雜度為o(1),是原地排序演算法。
3)演算法穩定性:如果兩個值相等,就不會交換位置,故是穩定排序演算法。
1.演算法原理
首先,我們將陣列中的資料分為2個區間,即已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想就是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間中的元素一直有序。重複這個過程,直到未排序中元素為空,演算法結束。
2.**實現
/**
* 插入排序
* @param a 待排序陣列
* @param n 表示陣列大小
*/public
static
void
insertsort
(int
a,int n)
else
} a[j+1]
=value;
//插入資料
}}
3.效能分析1)時間複雜度:最好、最壞、平均情況
如果要排序的陣列已經是有序的,我們並不需要搬移任何資料。只需要遍歷一遍陣列即可,所以時間複雜度是o(n)。如果陣列是倒序的,每次插入都相當於在陣列的第乙個位置插入新的資料,所以需要移動大量的資料,因此時間複雜度是o(n2)。而在乙個陣列中插入乙個元素的平均時間複雜都是o(n),插入排序需要n次插入,所以平均時間複雜度是o(n2)。
2)空間複雜度:從上面的**可以看出,插入排序演算法的執行並不需要額外的儲存空間,所以空間複雜度是o(1),是原地排序演算法。
3)演算法穩定性:在插入排序中,對於值相同的元素,我們可以選擇將後面出現的元素,插入到前面出現的元素的後面,這樣就保持原有的順序不變,所以是穩定的。
1.演算法原理
選擇排序演算法也分已排序區間和未排序區間。但是選擇排序每次會從未排序區間中找到最小的元素,並將其放置到已排序區間的末尾。
2.**實現
/**
* 選擇排序
* @param a 待排序陣列
* @param n 陣列長度
*/public
static
void
selectsort
(int
a,int n)
if(min != i)
}}
3.效能分析1)時間複雜度:最好、最壞、平均情況
選擇排序的最好、最壞、平均情況時間複雜度都是o(n^2)。為什麼?因為無論是否有序,每個迴圈都會完整執行,沒得商量。
2)空間複雜度:
選擇排序演算法空間複雜度是o(1),是一種原地排序演算法。
3)演算法穩定性:
選擇排序演算法不是一種穩定排序演算法,比如[5,8,5,2,9]這個陣列,使用選擇排序演算法第一次找到的最小元素就是2,與第乙個位置的元素5交換位置,那第乙個5和中間的5的順序就變數,所以就不穩定了。正因如此,相對於氣泡排序和插入排序,選擇排序就稍微遜色了。
1.氣泡排序和插入排序的時間複雜度都是 o(n^2),都是原地排序演算法,為什麼插入排序要比氣泡排序更受歡迎呢?
答:氣泡排序移動資料有3條賦值語句,而選擇排序的交換位置的只有1條賦值語句,因此在有序度相同的情況下,氣泡排序時間複雜度是選擇排序的3倍,所以,選擇排序效能更好。
氣泡排序,插入排序
前提 void x sort elementtype a,int n 大多數情況下,為簡單起見,討論從小大的整數排序 n是正整數 只討論基於比較的排序 有定義 只討論內部排序 穩定性 任意兩個相等的資料,排序前後的相對位置不發生改變 沒有一種排序是任何情況下 都表現最好的 氣泡排序 void bub...
氣泡排序 插入排序
學習思路 思路講解 實現 1 通過雙重迴圈,相鄰兩個資料做對比,通過位置交換使其變得有序 2 時間複雜度 分析 解釋 外部迴圈從0開始i 內部迴圈從0開始j,完整迴圈後會將本次最大值放入陣列最後,下次迴圈可忽略相應的尾部資料 length i 1 重複1 2步即可完成排序 實現 public cla...
氣泡排序,選擇排序,插入排序
氣泡排序,選擇排序,插入排序 小規模的檔案以及基本有序的檔案,插入排序的效能比快速排序的效能更為有效一些,實際上,插入排序通常也做快速排序實現的一部分。1 氣泡排序 packagedatastrut public classbubblesort public voidinsert longvalue...