快速排序.gif
原理
通常是以第一個元素為基準元素開始,然后從頭部和尾部開始遍歷,左邊都是比基準元素小,右邊是比基準元素大。
其中一次快排的過程:
- 設置兩個變量begin、end,將第一個元素作為基準值。
- 由end開始向前搜索(j--),遇到arr[j] < 基準值,將arr[j]和此時的a[i] 替換
- 由begin開始向后搜索(i++),遇到arr[i] > 基準值,將a[i]和a[j]替換
- 重試2、3步驟,直到i = j。
缺點
不穩(wěn)定。 快速排序的執(zhí)行時間與排列順序及基準值的選取有關。例如,
int[] arr = new int[]{1,2,3,4,5,6,7,8}
。按照快速排列的算法來,必須要經(jīng)過
n-1趟才能完成,也就是T(n)=n(n-1)/2約等 O(n2/2)。
最好的情況,是每趟排序將數(shù)組分成長度相近的兩個子數(shù)組,時間復雜度為O(n*logn).
空間復雜度O(logn),最壞的空間復雜度O(n),平均O(logn)。
代碼實現(xiàn)
public static void quickSort(int[] arr, int begin, int end) {
int i = begin, j = end;
int vot = arr[i]; //第一個值作為基準值
while (i < j) {
while (i < j && vot < arr[j]) {
//從后向前尋找比基準值小的元素
j--;
}
while (i < j && arr[i] < vot) {
//從前向后尋找比基準值大的元素
i++;
}
//如果前后指針碰撞
if (arr[i] == arr[j] && i < j) {
i++;
} else {
//替換元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//遍歷替換完成后,左邊為比基準小的元素,右邊為比基準大的元素,然后遞歸
if (i - 1 > begin) {
quickSort(arr, begin, i - 1);
}
if (j + 1 < end) {
quickSort(arr, j + 1, end);
}
}