tips:debug自己跑一下,看一下内部实现原理,可以更好的理解!
快速排序
原理:在数组中选择一个基准值,然后定义两个索引,这里选择第一个元素和最后一个元素下标,循环比较开始之前,定义一个变量记录当前基准值的值,然后从最后一个元素开始比较,将大于基准值的元素放到基准值的右边,小于基准值的元素放到基准值的左边,当两个索引值相等的时候,遍历结束,将先前变量记录的值赋值给当前索引,左半边和右半边循环执行上次操作,直到每一个区间只有一个值的时候,结束,此时,数组已经排好序了!
如下图所示:
代码实现
package com.lian.convert;
import com.alibaba.fastjson.JSON;
/**
* @author :LSS
* @description:快速排序
* @date :2021/3/31 10:44
*/
public class QuickSort {
public static int A(int[] nums, int start, int end) {
//定义基准值(默认是数组第一个值)
int mediaValue = nums[start];
//一次排序挪值的过程
while (start < end) {
//找到比基准值小的放到基准值的左边
while (start < end && mediaValue <= nums[end]) {
end--;
}
//找到后放到左边,左边下标加一
if (start < end) {
nums[start] = nums[end];
start++;
}
//找到比基准值大的放到基准值的右边
while (start < end && mediaValue >= nums[start]) {
start++;
}
//找到后放到右边,右边下标减一
if (start < end) {
nums[end] = nums[start];
end--;
}
}
//start和end相等时,第一次排序结束,将mediaValue的值赋值给当前下标
nums[start] = mediaValue;
//返回当前基准值对的下标
return start;
}
public static void QuickSort(int[] nums, int start, int end) {
int a;
if (start < end) {
//循环比较,最后基准值左边全是小于基准值的,右边全是大于基准值的,返回当前基准值对的下标
a = A(nums, start, end);
//左右两边继续循环排序,直到每个区间只有一个值结束
QuickSort(nums, start, a - 1);
QuickSort(nums, a + 1, end);
}
}
public static void main(String[] args) {
//要排序的数组
int[] nums = {1, 4, 6, 32, 4, 13, 9};
//执行程序进行排序
QuickSort(nums, 0, nums.length - 1);
//将排序之后的数组转化为字符串并输出
System.out.println(JSON.toJSONString(nums));
}
}
总结
不积跬步,无以至千里!