详细解读Java中的快速排序

快速排序是排序算法中非常优秀的算法之一。今天我们来分析一下快速排序的原理,算法以及空间复杂度和时间复杂度。

package com.test;

public class QuickSort_5_9 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[] { 5, 2, 6, 8, 1, 9, 4, 10, 7, 3 };
        quick(a, 0, a.length - 1);
        print(a);
    }

    private static void quick(int[] a, int iMin, int iMax) {
        // TODO Auto-generated method stub
        //定义三个变量,i和j  的作用就是起到导航作用,ipivot作用是存放第一个数作为基准值,同时将数据数组中腾出一个位置进行来回改变值。
        int i = iMin, j = iMax, ipiovt = a[i];
        //i和j的值分别是最小下标和最大下标。同时作为导航使用
        //判断i的值是否比j大,满足则直接返回,说明不满足基本条件
        if (i >= j) {
            return;
        }
        //如果i一直小于j则进行如下操作如果仍旧满足a[j] > ipiovt就是右边起的数值一直比基准值大就将j导航标向左移动,
        while (i < j) {
            while (i < j && a[j] > ipiovt) {
                j--;
            }
            //进入下边这个操作说明基准值大于a[j]这时候我们需要将j下标对应的数放置到前方空缺的那个位置中就是i的下表对应的数值,然后i进行加一操作。
            if (i < j) {
                a[i++] = a[j];
            }
            //这个时候开始进行从左向右与基准值ipiovt比较。如果满足下边这个条件将i进行加一。
            while (i < j && a[i] < ipiovt) {
                i++;
            }
            //执行下边的步骤说明a[i]>基准值,需要将a[i]的值放到j下标对应的位置。
            if (i < j) {
                a[j--] = a[i];
            }
        }
        //此时i和j相等就是此时中间空的位置,此时只需将ipivot放入到该位置即可。
        a[i] = ipiovt;
        //进行递归操作  分为两部分,左边一部分,右边一部分,注意此时i的位置一定固定,此时不需要再考虑i下下标对应的数即可。
        quick(a, iMin, i - 1);
        quick(a, i+1, iMax);
    }
//执行输出方法。
    public static void print(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

}

总结由于该方法使用的是递归一分为二,二分为四,所以满足对数所以平均时间复杂度为Olog(n log n)。最坏的情况下是O(n^2)。空间复杂度为O(log n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uniquewdl

匆忙的人生,总有你喜欢的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值