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