先分享個視頻教學網址,講的很nice! https://www.bilibili.com/video/BV1it41167v2?from=search&seid=7944545082422790984
- 概念
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
- 思路:
快速排序使用分治法來把一個串(list)分爲兩個子串(sub-lists)。具體算法描述如下:
1、從數列中挑出一個元素,稱爲 “基準”(pivot);
2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作;
3、遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
- 代碼
package Sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
QuickSort quickSort = new QuickSort();
int[] arr = {9,6,0,2,5,2,7,1,8};
quickSort.quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
/**
* 我們將數組的第一個元素當做基準 pivot
* @param arr 待排數組
* @param left 左邊的索引值(最小的索引值)
* @param right 右邊的索引值(最大的索引值)
*/
public void quickSort(int[] arr, int left, int right) {
if(left > right) {
return;
}
//定義基準值:規定將數組第一個元素當做基準pivot
//此時,應該先進行右遍歷,再進行左遍歷,否則兩個索引值相遇時,指向的元素比基準大。
int pivot = arr[left];
//首先定義一個變量,用來當左索引
int i = left;
//定義一個變量用來當右索引
int j = right;
//定義個臨時變量,用於元素交換
int temp;
//開始進行右左索引
while(i != j) {
//先進行右索引,直到找到比pivot小的元素
while(i < j && arr[j] >= pivot) {
j--;
}
//然後進行左索引,直到找到比pivot大的元素
while(i < j && arr[i] <= pivot) {
i++;
}
//此時,兩者應該同時找到符合要求的元素了,將i和j指向的元素進行交換
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//此時,i和j指向同一個元素,將這個元素和基準元素進行交換
arr[left] = arr[i];
arr[i] = pivot;
//此時,一遍快排完成,
//同時,對由基準劃分的左右兩個數組分別進行快排
quickSort(arr, left, i-1);
quickSort(arr, i+1, right);
}
}