1.算法思想:
每次排序都找一个基准位,使得基准位前端的部分每个数都小于基准位上的数,基准位后端的部分都大于基准位上的数,然后递归该过程
2.代码实现
public
static
void
quickSort(
int
[] arr){
qsort(arr,
0
, arr.length-
1
);
}
private
static
void
qsort(
int
[] arr,
int
low,
int
high){
if
(low < high){
int
pivot=partition(arr, low, high);
//将数组分为两部分
qsort(arr, low, pivot-
1
);
//递归排序左子数组
qsort(arr, pivot+
1
, high);
//递归排序右子数组
}
}
private
static
int
partition(
int
[] arr,
int
low,
int
high){
int
pivot = arr[low];
//枢轴记录
while
(low<high){
while
(low<high && arr[high]>=pivot) --high;
arr[low]=arr[high];
//交换比枢轴小的记录到左端
while
(low<high && arr[low]<=pivot) ++low;
arr[high] = arr[low];
//交换比枢轴小的记录到右端
}
//扫描完成,枢轴到位
arr[low] = pivot;
//返回的是枢轴的位置
return
low;
}
3.算法性能
平均时间复杂度为:O(nlogn)
平均空间复杂度为:O(logn)
4.算法优化
上面算法每次只从数组第一个开始取。如果我们采用“三者取中”,即arr[low],arr[high],arr[(low+high)/2]三者的中值作为枢轴记录,则可以大大提高快速排序在最坏情况下的性能