1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.递归,对左右区间重复第二步,直到各区间只有一个数。
java实现:
/**
* @Descript:快速排序算法
*
* @author LanJonah 2018年2月26日
* @param array
* 待排序数组
* @param startIndex
* 开始位置
* @param endIndex
* 结束位置
* @throws InterruptedException
*/
public static void quickSort(int[] array, int startIndex, int endIndex) throws InterruptedException {
if (startIndex >= endIndex)
return;
int boundary = boundary(array, startIndex, endIndex);
quickSort(array, startIndex, boundary - 1);
quickSort(array, boundary + 1, endIndex);
}
循环判断与基准值的对比结果并返回分界点:
/**
* @Descript:交换并返回分界点
*
* @author zyp 2018年2月26日
* @param array
* 待排序数组
* @param startIndex
* 开始位置
* @param endIndex
* 结束位置
* @return 分界点
*/
private static int boundary(int[] array, int startIndex, int endIndex) {
System.out.println("过程数组:"+Arrays.toString(array));
// 选择基准数(通常选用数组第一个数据做基准数)
int standard = array[startIndex];
System.out.println("基准数:"+standard+";startIndex="+startIndex+";endIndex="+endIndex);
// 左指针
int leftIndex = startIndex;
int rightIndex = endIndex;
while (leftIndex < rightIndex) {
//找到剩余区间里第一个比基准数小的值放到最左边
while (leftIndex < rightIndex && array[rightIndex] >= standard) {
rightIndex--;
}
System.out.print(" array["+leftIndex+"] = array["+rightIndex+"] ");
array[leftIndex] = array[rightIndex];
//找到剩于区间里第一个比基准数大的值放到最右边
while (leftIndex < rightIndex && array[leftIndex] <= standard) {
leftIndex++;
}
System.out.print(" array["+rightIndex+"] = array["+leftIndex+"] ");
array[rightIndex] = array[leftIndex];
}
array[leftIndex] = standard;
return leftIndex;
}
测试:
public static void main(String[] args) throws InterruptedException {
int[] array = { 6, 5, 1, 8, 4, 7 };
System.out.println("初始数组:"+Arrays.toString(array));
quickSort(array, 0, array.length - 1);
System.out.println("最终结果:"+Arrays.toString(array));
}
测试结果:
初始数组:[6, 5, 1, 8, 4, 7]
过程数组:[6, 5, 1, 8, 4, 7]
基准数:6;startIndex=0;endIndex=5
array[0] = array[4] array[4] = array[3] array[3] = array[3] array[3] = array[3] 过程数组:[4, 5, 1, 6, 8, 7]
基准数:4;startIndex=0;endIndex=2
array[0] = array[2] array[2] = array[1] array[1] = array[1] array[1] = array[1] 过程数组:[1, 4, 5, 6, 8, 7]
基准数:8;startIndex=4;endIndex=5
array[4] = array[5] array[5] = array[5]
最终结果:[1, 4, 5, 6, 7, 8]