1.快速排序算法的思想
快速排序是应用很广泛的排序算法。主要原因是它实现简单、适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多。快速排序主要思想就是当两个子数组都有序时整个数组也就自然有序了。而这个过程就是先选出一个基准数,一般都选第一个,然后基准数的左边都是小于基准数的,基准数的右边都是大于基准数的。然后以基准数为基准,切分出两个数组arr1和arr2。arr1中的数一定小于arr2的数。然后以此类推找基准数,排序,拆分数组这三个步骤进行下去。最后拆分到只有一个数时将不拆分了。
如图为快算排序算法的执行过程:
2.快速排序算法的特点
快速排序算法是一个原地排序(只需要一个很小的辅助栈)
长度为N的数组排序所需时间和N*lgN成正比。
缺点是非常脆弱,在实现时要非常小心才能避免低劣的性能。
3.快速排序算法的实现
主要是排序、切分两个过程。然后应当注意切分时下标是否越界,终止循环的条件、以及终止递归的条件等。
public class QuickSort {
//递归排序
private static void inputSort(double[] arr, int start, int end){
if(end<=start){
return;
}
int standrad=partition(arr, start, end);
inputSort(arr, start, standrad-1);
inputSort(arr, standrad+1, end);
}
//切分
private static int partition(double[] arr, int start,int end){
int i=start,j=end+1;
double v=arr[start];
while(i<j){
//防止下标越界
while(arr[++i]<v){
if(i==end){
break;
}
}
while(v<arr[--j]){
if(j==start){
break;
}
}
if(i>=j){
break;
}
if(arr[i]>arr[j]){
double temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
if(arr[start]>arr[j]){
double temp=arr[start];
arr[start]=arr[j];
arr[j]=temp;
}
return j;
}
public static void sort(double[] arr){
inputSort(arr, 0, arr.length-1);
}
public static void main(String[] args) {
double[] arr={3,8,9,32,2,20,1,4,7,5,5};
sort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
结果: