1.快排简介
快速排序采用的思想是分治思想
2.举例
迭代的思想
a[1….i]放比主元小的数,a[i+1….j]放比主元大的数
3.代码
/**
* 快速排序
*
* @author tujinpeng
*
*/
public class QuickSort {
/**
* 划分a[p...........q],主元是a[p]
* a[1....i]放比主元小的数
* @param a
* @param p
* @param q
* @return
*/
public static int partition(int[] a, int p, int q) {
int x = a[p];
int i = p;
for (int j = p + 1; j <= q; j++) {
if (a[j] < x) {
i++;
exchange(a,j,i);
}
}
exchange(a,p,i);
return i;
}
/**
* 快速排序
*
* @param a
* @param p
* @param q
*/
public static void quickSort(int[] a, int p, int q) {
if (p < q) {
int part = partition(a, p, q);
quickSort(a, p, part - 1);
quickSort(a, part + 1, q);
}
}
/**
* 交换
* @param a
* @param postion1
* @param postion2
*/
private static void exchange(int[] a, int postion1, int postion2) {
int temp = a[postion1];
a[postion1] = a[postion2];
a[postion2] = temp;
}
public static void main(String[] args) {
int a[] = { 3, 2, 7, 4, 0, 5, 6 };
quickSort(a, 0, 6);
for (int e : a) {
System.out.println(e);
}
}
}
4.时间复杂度分析
最差的时间复杂度 O(n2)
平均时间复杂度 O(n*logn)
5.快排优化
主元随机选取
选取数组第一个数,最后一个数,中间数,然后排序,中间的数作为主元
当子数组长度小到一定程度时,可以选取数量少排序快的算法(例如插入排序)