注:空间复杂度说明:
最优:O(logN)每次都刚好平分数组【见优化二,产生随机基准值】
最差:O(N)
1、普通快速排序
/**
*实现快速排序(普通快速排序)
*对arr[l,,,,r]共n个元素进行排序
*用递归方法,O(nlogn)
*方法一
*缺点:在近乎有序的数组下,该快排比归并要慢很多
*因为每次排序后,左右两个子递归规模相差悬殊,构成的二叉树平衡因子没有归并好
*在完全有序时,退化为O(n^2)
*优化:随机选取基准值
*/
public class QuickSort {
public void quickSort(int []arr,int n) {
__quickSort(arr,0,n-1);
}
private void __quickSort(int[] arr, int l, int r) {
//首先处理递归到底的情况,左边大于右边
//可以优化,如果对于小数组时,可以用插入排序完成
if(l>=r)
return;
int p=media(arr,l,r);
//对arr[l,,p-1]和arr[p+1,,,r]递归,每次比基准值小的在左,大的在右
__quickSort(arr, l, p-1);
__quickSort(arr, p+1, r);
}
//每次以第一个元素季即arr[l]为基准,比基准值小的在右,大的在左,
//返回基准值最终在数组中的位置
private int media(int[] arr, int l, int r) {
//
int v=arr[l];
int j=l;
//int temp=arr[l];
for(int i=l+1;i<=r;i++) {
//每次循环将小于v的往前换
if(a