(容易理解版)快速排序算法和时间、空间复杂度的计算

public class QuickSort {
    /**
     * 快速排序
     * @param args
     */
    public static void main(String[] args) {
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));

    }

    public static void quickSort(int[] arr,int left,int right){
        int i,j,standard;
        //left与right固定不变,通过改变i、j进行指针的移动
        i = left;
        j= right;
        //迭代退出的条件
        if(i>=j){
            return;
        }
        standard = arr[left];
        while(i<j){
            //以左起点为基准值,要先移动右指针,否则可能会出现基准值与j位置的值交换后,j左侧的数组值不满足都小于j位置的值
            while(standard<=arr[j] && i<j){
                j--;
            }
            while(standard>=arr[i] && i<j){
                i++;
            }
            if(i<j){
                arr[j] = arr[j]^arr[i];
                arr[i] = arr[i]^arr[j];
                arr[j] = arr[j]^arr[i];
            }
        }
        //令数组中基准值与下标为j的值进行交换,使得j左边小于j位置的值,j左右边大于j位置的值
        arr[left] = arr[j];
        arr[j] = standard;
        quickSort(arr,left,j-1);
        quickSort(arr,j+1,right);
    }
}

快速排序时间复杂度的计算:

设n=2^k,这是为了最后能得到T(1),T(1)=0
T(n)=2T(n/2)+n
      =2(2T(n/4)+n/2)+n
      =4T(n/4)+2n
      =4(2T(n/8)+n/4)+2n
      =8T(n/8)+3n
      =......
   =2^kT(1)+kn    将n=2^k代入
     =n(T(1)+log2n)  将T(1)=0代入
     =nlog2n
     =o(nlogn)
所以快速排序的时间复杂度是o(nlogn)

快速排序空间复杂度计算:

迭代空间复杂度=迭代深度*每次迭代的空间复杂度。

深度          1  2  3  4  ...  k
调用次数   1  2  4  8  ...  2^(k-1)

假设有1个数据就要调用1次,则n个数据要调用2^(k-1)次,但是有1个数据时不需要调用,所以n<2^(k-1),此处的n是调用n次的n,则k>logn+1,所以迭代的空间复杂度大于o(logn).
若数据是按顺序排列的,一共需要调用n-1次,则最大空间复杂度为o(n).

快速排序的空间复杂度在o(logn)~o(n)之间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值