思想
快速排序每一趟排序,都會尋找一個基準(zhǔn)元素,有的采用第一個元素,有的會隨機(jī)生成一個,但是基本思想是不變的,一趟排序結(jié)束,會形成以基準(zhǔn)元素為分界點的兩部分,其中左邊比基準(zhǔn)元素?。僭O(shè)從小到大排序),右邊比基準(zhǔn)元素大。然后再以相同的方法處理左邊和右邊兩部分,即遞歸。
快速排序
實現(xiàn)(java)
import com.jiajia.ArrayUtil.ArrayUtil;
/**
* @ClassName: QucikSortMain
* @Author: Numen_fan
* @Date: 2019/3/6 下午9:02
* @Version: 1.0
* @Description: 快速排序
*/
public class QucikSortMain {
public static void main(String[] args) {
int[] arr = {4,2,35,9,7,8,1,5,0,4,3};
quickSort(arr, 0, arr.length - 1);
ArrayUtil.print(arr);
}
private static void quickSort(int[] arr, int left, int right){
if (left >= right) { // 必須加
return;
}
int temp = arr[left]; // 以左邊的元素為基準(zhǔn)元素
int i = left, j = right; // i,j為兩個游標(biāo)
while (i < j) {
while (i < j && arr[j] >= temp){ // 右邊先走
j--;
}
while (i < j && arr[i] <= temp) {
i++;
}
if (i < j) {
swap(arr, i, j);
}
}
arr[left] = arr[i]; // 注意,這一步必須要,填上最左邊的坑
arr[i] = temp; // 基準(zhǔn)元素就位
quickSort(arr, left, i - 1); // 遞歸操作左邊部分
quickSort(arr, i + 1, right); // 遞歸操作右邊部分
}
/**
* 交換兩個元素
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
很多方法會寫成兩個函數(shù),一個用來返回一趟結(jié)束后基準(zhǔn)元素的位置,然后一個外圍函數(shù)用來遞歸,其實和這個類似,其實就是將后面兩個遞歸函數(shù)之前的部分封裝成一個函數(shù)而已!
參考資料
快速排序(過程圖解)
白話經(jīng)典算法系列之六 快速排序 快速搞定
值得收藏的十大經(jīng)典排序算法
最后
此致,敬禮