學習演算法的好處
學習演算法的過程其實是乙個提高思維能力的過程。
基本的排序演算法(簡單直接幫助迅速寫出沒有bug的**)
氣泡排序/bubble sort
插入排序/insertion sort
常考的排序演算法(解決絕大部分設計排序問題的關鍵)
歸併排序/merge sort
快速排序/quick sort
拓撲排序/topological sort
其他排序演算法(掌握好它的解題思想能開闊解題思路)
堆排序/heap sort
桶排序/bucket sort
氣泡排序的演算法思想
每一輪,從雜亂無章的陣列頭部開始,每兩個元素比較大小並進行交換;
直到這一輪當中最大或最小的元素被放置在陣列的尾部;
然後,不斷地重複這個過程,直到所有元素都排好位置。
氣泡排序空間複雜度:o(1)
假設陣列的元素個數是n,整個排序的過程中,直接在給定的陣列裡進行元素的兩兩交換。
氣泡排序的時間複雜度:o(n^2)
情景一:給定的陣列按照順序已經排好
只需要進行n-1次的比較,兩兩交換次數為0,時間複雜度是o(n),這是最好的情況。
情景二: 給定的陣列按照逆序排列
只需要進行n(n-1)/2次比較,時間複雜度是o(n^2),這是最壞的情況。
情景三:給定的陣列雜亂無章
在這種情況下,平均時間複雜度是o(n^2)。
氣泡排序是一種穩定的排序演算法,所謂的穩定,也就是說,對於陣列裡兩個相等的數,經過排序後這兩個數的相對位置保持不變。
插入排序與氣泡排序的對比
在氣泡排序中,經過每一輪的排序處理後,陣列後端的數是排好序的;
在插入排序中,經過每一輪的排序處理後,陣列前段的數都是排好序的。
插入排序的演算法思想
不斷地將尚未排好序的數插入到已經排好序的部分。
插入排序的空間複雜度:o(1)
假設陣列的元素個數是n,整個排序的過程中,直接在給定的陣列裡進行元素的兩兩交換。
插入的時間複雜度:o(n^2)
情景一:給定的書庫按照順序已經排好
只需要進行n-1次的比較,亮亮交換次數為0,時間複雜度是o(n),這是最好的情況。
情景二:給定的陣列按照逆序排列
需要進行n(n-1)/2次比較,時間複雜度是o(n^2),這是最壞的情況。
情景三:給定的陣列雜亂無章
在這種情況下,平均時間複雜度是o(n^2)
插入排序也是一種穩定的排序演算法
分治的思想
歸併排序的核心思想是分治,把乙個複雜問題拆分成若干個子問題來求解。
歸併排序的演算法思想
把陣列總中間劃分成兩個子陣列;
已知遞迴地把子陣列劃分成更小的子陣列,直到子陣列裡面只有乙個元素;
依次按照遞迴的返回順序,不斷地合併排好序的子陣列,直到最後把整個陣列的順序排好。
歸併排序的時間複雜度: t(n)
歸併演算法是乙個不斷遞迴的過程,假設陣列的元素個數是n。
時間複雜度是t(n)的函式:t(n)=2*t(n/2) + o(n)
如何解這個公式?
對於規模為n的問題,一共要進行log(n)層的小大切分;
每一層的合併複雜度都是o(n)
所以整體的複雜度就是o(nlogn)
歸併排序的空間複雜度:o(n)
由於合併n個元素需要分配乙個大小為n的額外陣列,合併完成之後,這個陣列的空間就會被釋放。
歸併排序也是穩定的排序演算法。
快速排序的演算法思想
快速排序也採用了分治的思想;
把原始的陣列篩選成較小和較大兩個子陣列,然後遞迴地排序兩個子陣列;
在分成較小和較大的兩個子陣列過程中,如何選定乙個基準值尤為關鍵。
需要注意的是:
快速排序是直接在原始陣列裡進行各種操作的,所以當子陣列被分割出來時,原始陣列裡的排序也被改變了。
快速排序最優情況下的時間複雜度
t(n)=2*t(n-1)+o(n)
o(n)的由來:
把規模大小為n的問題分解成n/2的兩個子問題;
和基準值進行n-1次比較,n-1次的比較的複雜度就是o(n)
這種情況下快速排序的複雜度也是o(nlogn)
快速排序最複雜的情況
每次在選擇基準值的時候,都不幸選擇了子陣列裡的最大或最小值
其中乙個子陣列長度為1
另乙個長度只比父陣列少1
此時的情況類似於氣泡排序,這意味著在最壞情況下快速排序的時間複雜度為o(n^2)
然而,可以通過隨機地選取基準值就可以避免這種最壞的情況
快速排序的空間複雜度:o(logn)
和歸併排序不同快速排序再每次遞迴的過程中
只需要開闢o(1)的儲存空間來完成交換操作實現直接對陣列的修改
而遞迴次數為logn,所以它的整體空間複雜度完全取決於壓堆疊的次數。
拓撲排序的應用場合
拓撲排序就是要將圖論裡的頂點按照相連的性質進行排序
拓撲排序的前提
必須是有向圖
圖里沒有環
拓撲排序的時間複雜度:o(n)
統計頂點的入度需要o(n)的時間
接下來每個頂點被遍歷一次,同樣需要o(n)的時間
STL中常用的排序演算法
merge 例如 vecinta,vecintb,vecintc是用vector宣告的容器,vecinta已包含1,3,5,7,9元素,vecintb已包含2,4,6,8元素 vecintc.resize 9 擴大容量 merge vecinta.begin vecinta.end vecintb....
面試常用排序演算法
public class sort 因為最後結束的時候,j又被剪了一次,所以j要加1 插入 array j 1 temp 氣泡排序 public void bubblesort int array,int length 直接選擇排序 public void selectsort int array,...
Java中常用的陣列排序演算法
氣泡排序 雙層迴圈實現。外層迴圈控制排序輪數,內層迴圈對比陣列中每個臨近元素的大小,以確定是否交換位置 程式 從小到大 public class bubblesort bubblesort sorter new bubblesort create a bubble sort class object...