最近一个面试题考了快速排序,平时不用功没做出来,下来后自己
看了些资料了解了其实现原理。也从网上找了几个实现代码,但这
些代码,试了下好多都有问题,普遍不能处理存在相同值的情况。
而且那些代码看着特变乱,所以自己写了一个。package com.fhd.financial.analysis.test;import java.util.Random;public class QuickSortTest {
public static void main(String[] args){
double[] a=new double[50];
boolean isPassed=true;

for(int i=0;i<10000;i++){
try{
getData(a);

printArray(a,"原始数据");

quickSort(a,0,a.length-1);

printArray(a,"排序之后");

System.out.println(/*isPassed?"测试通过!":"测试未通过"*/);

if(!checkSort(a)){
isPassed=false;
break;
}

}catch(Exception e){
isPassed=false;
System.out.println(e.getMessage());
}
}

if(isPassed){
System.out.println("测试通过");
}else{
System.err.println("测试未通过");
}

}

public static void quickSort(double[] a,int lo,int hi){
if(lo<0 || hi>a.length || lo>=hi) return;

//quick sort
double tmp,baseVal =a[lo];
int i=lo,j=hi;

while(i<j){
while(i<=hi && a[i]< baseVal) i++;
while(j>=lo && a[j]> baseVal) j--;

if(i>=lo && lo<=hi && j>=0 && j<=hi){
tmp =a[i];
a[i] =a[j];
a[j] =tmp;
}

//避免因左右都等于baseVal造成死循环
if(a[i]==a[j]) j--;
}

//quickSort Left  part
quickSort(a,lo,i-1);

//quicksort right part
quickSort(a,i+1,hi);
}


public static void getData(double[] a){
Random rand=new Random();

for(int i=0,len=a.length;i<len;i++){
a[i]=rand.nextInt(100);
}
}


public static boolean checkSort(double[] a){
boolean isValid=true;

for(int i=1,len=a.length;i<len;i++){
if(a[i]<a[i-1]){
isValid=false;
break;
}
}

return isValid;
}

public static void printArray(double[] a,String msg){
System.out.print(msg+":");

for(double d:a){
System.out.print(String.format("%-5d", (int)d));
}

System.out.print('\n');
}
}