声明:本文资源来自网上和博主的再加工,仅供自己学习、修改和分享,如有侵权,请告知,定会及时删除,谢谢。
思路借鉴:https://www.bilibili.com/video/BV1vP411g7J3
代码示例
package com.example.algorithm.demo;
/**
* @ Description 快速排序:挖坑填数 + 分治。注意:坑位指的是已在别处保有该下标的原值,该下标可以被覆盖。
* 1.在数组中取一个基准数并记录,一般取第一位,此时该下标就是坑位。代码中的base
* 2.使用两个指针,一个指向数组的头部,一个指向数组的尾部。代码中的low和high
* 3.移动尾指针,找到比基准数小的值,填进坑位,此时该值原下标为新的坑位。
* 4.移动头指针,找到比基准数大的值,填进坑位,此时该值原下标为新的坑位。
* 5.交替3和4,直至头指针与尾指针下标相等,最后将基准数填进该下标坑位。
* 6.以5最后的下标坑位将原数组分割为两个数组,再分别对这两个数组进行快速排序。
* @ author xx
* @ date 2023/10/10 15:18
* @ version 1.0
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = new int[]{5, 2, 6, 4, 7, 9, 1, 3};
sort(a, 0, a.length - 1);
for (int value : a) {
System.out.print(value);
}
}
/**
* 快速排序,递归分治
*
* @param a 原数组
* @param low 头指针
* @param high 尾指针
* @author 朱桂彬 2023/10/10 15:41
*/
public static void sort(int[] a, int low, int high) {
if (low < high) {
// 获取分割点
int partition = partition(a, low, high);
// 对分割点前半部分排序
sort(a, low, partition - 1);
// 对分割点后半部分排序
sort(a, partition + 1, high);
}
}
/**
* 快排
*
* @param a 原数组
* @param low 头指针
* @param high 尾指针
* @return int 两个指针最后指向的下标值
* @author 朱桂彬 2023/10/10 11:28
*/
public static int partition(int[] a, int low, int high) {
// 获取基准值,此时该值的下标就是坑位
int base = a[low];
// 头指针与尾指针下标相等时结束循环
while (low < high) {
// 先从尾指针往前移动,尾指针的值小于基准值时结束循环
while (low < high && a[high] >= base) {
// 尾指针的值大于等于基准值,向前移动尾指针
high--;
}
// 尾指针的值小于基准值,将尾指针的值填进坑位,然后尾指针的下标为新的坑位
a[low] = a[high];
// 再从头指针往后移动,头指针的值大于基准值时结束循环
while (low < high && a[low] <= base) {
// 头指针的值小于等于基准值,向后移动尾指针
low++;
}
// 头指针的值大于基准值,将头指针的值填进坑位,然后头指针的下标为新的坑位
a[high] = a[low];
}
// 头指针与尾指针下标相等时,将基准值填进该下标
a[low] = base;
// 最后返回两个指针最后指向的下标值
return low;
}
}