快速排序是現在使用的很多的一種排序演算法,同時也是很有可能會被面試問到的乙個基礎排序演算法題。
那麼怎麼了解快速排序呢?
其實想要了解快速排序,首先我們需要知道氣泡排序,這是為啥?
這是因為快速排序是在氣泡排序的基礎上的改良呀!
氣泡排序
氣泡排序的基本思想:每次都比較相鄰的兩個元素,如果這兩個元素大小位置不對勁,那就將這兩個元素的位置交換一下,這樣就會使得每次都有乙個符合最大/最小的數被置換到最後乙個位置。
ps:當然,是最大的數置換還是最小的數置換,要看是從小到大還是從大到小。
冒泡兩個字也是最為形象的描述,表明每一輪都會有乙個符合要求的資料從底層慢慢的冒出來,一直到最後乙個位置,如果將資料由橫變成豎著看,那就是更為形象的冒泡了,會發現資料5從第二層慢慢到最高一層了。
第二輪繼續從第一層開始,但是最後的結束卻是在第四層,這是為什麼呢?這是因為在第一輪的時候第五層,也就是最高的一層我們的資料已經是最大的了,在第一輪迴圈的時候我們已經找到了確定的資料,所以第二輪迴圈第五次是不再需要比較的。
也就是說:對於n個數來進行氣泡排序,你需要進行n-1輪第一層迴圈,每一層需要進行n-1-i 輪迴圈,其中i是第一層迴圈的輪數。
其中為啥第一層迴圈是n-1層呢?那是因為第一層在最後是不需要進行繼續排序的,最後一次迴圈也就剩自己了,難不成還需要自己和自己排序嗎?
這樣就可以算出氣泡排序的時間複雜度:o(n^2)
由於沒有申請額外的空間,所以空間複雜度:o(1)
**的實現:
public static void bubblesort(int arr)}}
//將資料進行列印
for(int num:arr)
}
接下來 我們就可以來看一看快速排序了!
快速排序
由於氣泡排序的時間複雜度是o(n^2),那麼是否可以進行進一步的優化,來降低時間複雜度呢?也是出於這乙個想法,快速排序便誕生了!
快速排序的基本思想:其實快速排序使用的是乙個被稱為分治的思想,就是一分為二,二分為四…
首先我們選擇乙個基準數,然後對這個陣列中的所有數進行遍歷,比這個數大的放到這個數的右邊,比這個數小的放到這個數的左邊,此時就會將陣列分為兩個部分,然後分別對這個兩個部分進行遞迴的操作,知道最後每部分只有了乙個數,也就達到了排序的目的。
欸?為什麼原來的資料 4 3 5 1 2 經過了選擇基準數4之後變成了 1 3 2 4 5了呢?這樣看起來完全沒有規律啊?
其實,在快速排序演算法的實現中,我們還加入了兩個輔助的人員,我們稱之為「哨兵」,乙個「哨兵i」在陣列的左邊,每次迴圈都找比基準數大的數,另乙個「哨兵j」在陣列的右邊,每次迴圈都找比基準數小的數,每次將兩者找到的數進行交換,直到兩個哨兵遇到了,就把現在的數和基準數進行交換,完成排序。
想一想為啥需要是哨兵j先出發,哨兵i先出發不可以嗎?
首先我們需要知道,哨兵j尋找的數的性質:是乙個比基準數小的數,但是哨兵i呢?哨兵i尋找的數的性質是乙個比基準數大的數,
那麼在我們最後當兩者相遇的時候,如果是哨兵j先出發,那麼相遇的值是乙個比基準數小的數為結束,而基準數我們的選擇是在陣列的左邊,是乙個儲存比基準數小的位置,那麼這個時候互換位置是不會出現問題的,
但是呢,如果是哨兵i先出發,那麼最後相遇的時候,豈不是乙個比基準數大的數,交換了的話這個數就跑到左邊去了,那這一次豈不是白找了???
如果還是不理解的話,可以自己找一組資料在紙上畫一畫!
**的實現:
/**
* 快速排序邏輯實現
* @param left 哨兵i的起始位置
* @param right 哨兵j的起始位置
*/public static void quicksort(int arr,int left,int right)
//快速排序三要素準備
int temp = arr[left];//基準數
int i = left;//哨兵i
int j = right;//哨兵j
while (i < j)
//哨兵i開始,尋找比基準數大的數
while (arr[i] <= temp && i < j)
if (i < j)
}//迴圈結束,表示此時兩個哨兵碰面了,那麼我們需要把基準數歸位了
arr[left] = arr[i];
arr[i] = temp;
//開始剩下的兩部分的迴圈呼叫
quicksort(arr,left,i-1);
quicksort(arr,i+1,right);
}
經過這一次的優化,時間複雜度:o(nlogn)由於沒有申請新空間,所以空間複雜度:o(1)這便是快速排序演算法了!!! 排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...