一.基本思想
采用分治思想
(1)从序列中挑出一个元素作为“基准”(privot)
(2)把所有比基准小的元素放在基准前面,把所有比基准大的元素放在基准后面,这个操作称为“分区”
(3)对每个分区递归的进行(1),(2),递归结束的条件是序列的大小是0或1
二.概览
分类:内部比较排序
数据结构:数组
最差时间复杂度:(每次选取的基准都是最大或最小的元素,导致只划分出一个分区,需要进行n-1次递归)O(n^2)
最优时间复杂度:每次选取的基准都是中位数,这样每次可以划分出两个分区,只需要logn次就能划分出分区O(nlogn)
平均时间复杂度:O(nlogn)
所需辅助空间:主要是递归造成的栈空间的使用,取决于递归树的深度。一般为O(logn),最大O(n)
稳定性:不稳定(不稳定发生在基准元素与比基准元素大的序列的第一个值交换的时候)
三.代码实现
public class quick {
//交换函数
public static void swap(int A[], int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//分区
public static int partition(int a[],int left,int right){
int pivot = a[right];//每次都将最后一个值定为基准
int tail = left-1;
for (int i=left;i<right;i++){
if (a[i] <= pivot){ //把小于基准元素的都放到数组末尾
swap(a,++tail ,i );
}
}
swap(a, tail+1, right);//该操作很可能把后面元素的稳定性打乱,所以是不稳定的排序
return tail+1;
}
//排序
public static void sort(int a[],int left,int right) {
if(left >= right) return ;
int pivot = partition(a, left, right);
sort(a, left, pivot-1);
sort(a, pivot+1, right);
}
public static void main(String[] args) {
int a[] = {5,8,9,3,7,1,6,3};
sort(a,0,a.length-1);
for (Integer i : a) {
System.out.print(i+" ");
}
}
}
