快速排序也屬於內部排序,他是對氣泡排序的改進。基本思想是:在一趟排序時,選定乙個值(一般選陣列的中間值),在這趟排序過程中將陣列中小於這個中間值數放在陣列左邊,大於中間值的數放在陣列右邊,然後在繼續按照這種方法將左右兩邊的數進行快速排序,最終得到有序陣列。示意圖如下:
下面是用遞迴實現的快排:
public class quicksort ;
quicksort quicksort = new quicksort();
quicksort.sort(arr,0,arr.length-1);
quicksort.print(arr);
}/**
* 對陣列排序
* @param arr 要排序的陣列
* @param left 左下標,從這個下標開始
* @param right 右下標,到這個下標結束
*/private void sort(int arr,int left,int right)
//找右邊小於midvalue的元素
while (arr[r] > midvalue)
//情況1:左邊的值都小於中間值,右邊值都大於中間值,退出迴圈
if (l>=r)
//交換
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//交換之後,左邊到達中間值,右邊還沒比完,繼續比右邊下乙個元素
if (arr[l]==midvalue)
//交換之後,右邊到達中間值,左邊還沒比完,繼續比左邊下乙個元素
if (arr[r] == midvalue)
}//出迴圈,先判斷l,r的關係,否則會棧溢位
if (l == r)
//左遞迴i
if (left < r)
//右遞迴
if (l < right)
}private void print(int arr)}}
值得注意的是while迴圈裡的兩個while迴圈執行後的情況。
中間值的左邊元素都小於中間值,右邊元素都大於中間值,此時l>=r,退出while迴圈,執行左遞迴和右遞迴;
找到了不滿足條件的元素,交換;
交換後,如果arr[l] == midvalue,此時左邊元素已經全部找完了,右邊元素還沒有全部找完,則r--,繼續判斷右邊的元素;
交換後,如果arr[r] == midvalue,此時右邊元素已經全部找完了,左邊元素還沒有全部找完,則l++,繼續判斷左邊的元素;
如果不是以上這四種情況,證明左右兩個的元素都沒有找完,繼續迴圈即可。
出外層大迴圈後,還需判斷l是否等於r,若l==r則需執行l++;r--;否則棧溢位!
還要記得,在左右遞迴之前要先判斷一下傳入的左右下標是否合法哦。
資料結構排序之快速排序
本來昨天晚上就可以把快速排序發上去,沒想到昨晚csdn竟然維護,那麼就只能在停電的情況下下用學校的卡的要死的網發這快速排序了,不停多好,停電了還得自己掏腰包買個充電檯燈,裝的好像像學霸一樣,實際就是乙個大學渣,我也就不jjyy,直接說快速排序的思想,我是這樣理解的,用乙個變數作為基準,在拿出i和j兩...
資料結構之快速排序
3.編寫乙個快速排序的演算法,並且在main函式中驗證其功能已實現 快速排序 quick sort 又稱劃分交換排序,基本思想 在待排序的n 個記錄中記錄中任取乙個作為 基準 將其餘記錄分為兩組,第一組中 各記錄的鍵值均小於或等於基準的鍵值,第二組中各記錄的鍵值均大於 或等於基準的鍵值,而基準就排在...
資料結構之快速排序
旁白 演算法小白白一枚,突然要掌握演算法。花廢了2個小時把一些基本的知識掌握。包括偽 書寫規則 演算法設計技術和時間複雜性的計算弄清楚。本打算用本子做筆記,一想發現沒筆 沒本子,這對本在疫情被困在家的我來說是一筆 鉅額 所以想到寫部落格,一方面剛接觸感覺有點意思,另一方面當做筆記隨時可以複習看看 廢...