一、简介
在上一篇文章,我们已经了解了二分查找的算法,今天所讲的快速排序算法就是依据二分法以及递归实现。快速排序采用分治的思想,首先在数组中选择一个基准点,然后从数组的两端扫描数组,设两个指示标志(low指向起始位置,hign指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和hign位置的值,然后从前半部分开始查找,发现有元素大于基准点的值,就交换low和hign位置的值,如此往复循环,直到 low >= hign,然后把基准点的值放到hi这个位置。一次排序就完成了。然后再采用递归的方式分别对左右两部分的数组进行再次排序。
二、排序思路
具体排序步骤以及分治思想如下图:
三、算法实现
/**
* @Title: QuickSortUtils
* @ProjectName java_sort
* @Description: 快速排序工具类
* @Author WeiShiHuai
* @Date 2018/10/20 17:00
*/
public class QuickSortUtils {
/**
* 获取基准值的位置
*
* @param array 待排序数组
* @param low 起始位置
* @param hign 终止位置
* @return
*/
private static int getReferIndex(int[] array, int low, int hign) {
//将第一个元素作为参照值
int referenceValue = array[low];
while (low < hign) {
//从后往前找,如果没有找到比基准值小的元素,那么执行hign--
while (low < hign && array[hign] >= referenceValue) {
hign--;
}
//将比基准值小的值移动到左边
array[low] = array[hign];
//从前往后找,如果没有找到比基准值大的元素,那么执行low++
while (low < hign && array[low] <= referenceValue) {
low++;
}
//将比基准值大的数移动到右边
array[hign] = array[low];
}
array[low] = referenceValue;
return low;
}
/**
* 快速排序递归实现
*
* @param arr 待排序数组
* @param low 起始位置
* @param hign 终止位置
* @return
*/
public static int[] quickSort(int[] arr, int low, int hign) {
if (low >= hign) {
return null;
}
int middleIndex = getReferIndex(arr, low, hign);
//递归对左边的数组(所有比基准值小的元素)进行排序
quickSort(arr, low, middleIndex - 1);
//递归对右边的数组(所有比基准值大的元素)进行排序
quickSort(arr, middleIndex + 1, hign);
return arr;
}
}
测试:
public class TestQuickSortUtils {
public static void main(String[] args) {
int[] array = {4, 3, 6, 9, 7, 1, 2, 4};
int[] newArr = QuickSortUtils.quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(newArr));
}
}
测试结果:
四、总结
本文是作者对快速排序算法的一些总结以及思路,仅供大家参考学习,一起学习一起进步。