详细解读Java中的快速排序

来源:互联网 发布:originlab软件下载 编辑:程序博客网 时间:2024/05/29 09:46

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

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
原创粉丝点击