/*快速排序
*思想: 分治的排序算法,它将一个数组分成两个数组,将两部分独立的排序。
* 先选取一个元素作为切分元素,然后从数组两边向中间扫描,使得左边的元素小于等于切分元素,右边的元素大于等于切分元素。
* 这样递归进行,直到整个数组有序。
* 时间复杂度: O(N㏒N)
* 空间复杂度: 需要一个很小的辅助栈
*
* */
package paixu;
import java.util.*;
public class Quick extends Example{
public static void sort(Comparable[] a){
List list = Arrays.asList(a);
Collections.shuffle(list); //将数组打乱,消除对输入的依赖
sort(a,0,a.length-1);
}
private static void sort(Comparable[] a,int lo,int hi){
if(hi<=lo) return;
int j = partition(a,lo,hi);
sort(a,lo,j-1); //将左半部分排序
sort(a,j+1,hi); //将右半部分排序
}
private static int partition(Comparable[] a,int lo,int hi){
//将数组切分为a[lo..i-1],a[i],a[i+1..hi]
int i=lo, j=hi+1; //左右扫描指针
Comparable v = a[lo]; //切分元素
while(true){
//扫描左右,检查扫描是否结束并交换元素
while(less(a[++i],v)) if(i==hi) break;
while(less(v,a[--j])) if(j==lo) break;
if(i>=j) break;
exch(a,i,j);
}
exch(a,lo,j); //将v=a[j] 放入正确的位置
return j; //此时有a[lo..i-1]<=a[i]<=a[i+1..hi]
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/*String[] a = {"ddd","bbb","ccc","aaa"};
Quick.sort(a);
Example.show(a);
*/
String alg1 = "Shell";
String alg2 = "Quick";
int N = 100000;
int T = 10;
long t1 = SortCompare.timeRandomInput(alg1, N, T);
long t2 = SortCompare.timeRandomInput(alg2, N, T);
System.out.println("希尔排序运行时间:"+t1);
System.out.println("快速排序运行时间:"+t2);
}
}