面試中常用的演算法 排序

2021-10-04 19:30:45 字數 3044 閱讀 2554

學習演算法的好處

學習演算法的過程其實是乙個提高思維能力的過程。

基本的排序演算法(簡單直接幫助迅速寫出沒有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...