1.基本思想:
选择一个基准元素,通常选择第一个元素和最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于登陆基准元素,此时基准元素在其排好序之后的正确位置,然后再用同样的方法递归的排序划分的两部分。
2.实例:
3.代码实现:
package com.sfd.quicksort;
public class QuickSort {
public static void main(String[] args) {
int[] a = {57,68,59,52,72,28,96,33,24,19};
quickSort(a, 0, a.length-1);
for(int i:a){
System.out.println(i);
}
}
/**
* 通过一次扫描将数组分成了两部分(分区),分别对这两部分进行partition处理;
* 直到无法在进行分割位置,就是一个分区中只有一个数据即left>=right时
* @param a
* @param left
* @param right
*/
public static void quickSort(int[] a,int left,int right){
int pt;
if(left<right){
pt = patition(a, left, right);
quickSort(a,left, pt);
quickSort(a, pt+1, right);
}
}
/**
* 将数组中left到right中的数进行分区,首先设定一个标准值:pivot
* 再进行双向扫描:大于基准值的pivot的放在右侧,小于pivot的放在右侧;
* 最后当left>=right时,停止扫描;
*
* @param a
* @param left
* @param right
* @return
*/
public static int patition(int[] a,int left,int right){
int pivot = a[left];
while(left<right){
while(left<right&&a[right]>pivot){
right--;
}
if(left<right){
a[left++]=a[right];
}
while(left<right&&a[left]<pivot){
left++;
}
if(left<right){
a[right--]=a[left];
}
}
a[left]=pivot;
return left;
}
}