描述
實(shí)現(xiàn)快速排序算法分析
隨機(jī)選擇待排序數(shù)組中一個(gè)元素為中心軸,將所有小于中心軸的元素移到左邊,大于中心軸的元素移到右邊,然后對(duì)中心軸左邊和右邊按照以上步驟遞歸下去,直至有序。
中心軸的選擇很重要,比較好的情況就是恰好選擇的元素就是數(shù)組的中位數(shù),這時(shí)候遞歸樹(shù)相對(duì)平衡,遞歸樹(shù)的高也就是棧的深度,樹(shù)越平衡,消耗的棧空間越少,最壞情況,即待排序數(shù)組逆序,可以演化為冒泡排序,且空間復(fù)雜度O(n)。時(shí)間復(fù)雜度O(nlogn),空間復(fù)雜度O(logn)
public class Solution {
public void quickSort(int[] arr, int left, int right) {
int pivotIndex = partition(arr, left, right);
if(left < pivotIndex - 1)
quickSort(arr, left, pivotIndex - 1);
if(right > pivotIndex)
quickSort(arr, pivotIndex, right);
}
public int partition(int[] arr, int left, int right) {
int pivot = arr[(left+right)/2];
while(left <= right) {
while(arr[left] < pivot)
++ left;
while(arr[right] > pivot)
-- right;
if(left <= right) {
swap(arr, left, right);
++ left;
-- right;
}
}
return left;
}
public void swap(int[] arr, int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}