快速排序
核心思想:
1、选取一个左边第一个元素为基数,从两头遍历集合( left、right 分别从两端索引)
2、判断 left 索引的值 大于 基数的 值,right 索引小于 基数的值 (right 先索引,然后 left 索引,当遇到符合的条件时停止索引)
3、交换两个索引的数值,然后继续遍历
4、当 left 与 right 相遇时 结束当前索引(即 left = right)
5、将基数所在位置与 left(或right) 所索引位置的值进行交换
6、递归调用当前基数索引(idx)两端的集合:left …… idx-1 idx idx + 1 …… right
快速排序的
时间复杂度为O(NlogN)
package com.jason.sort;
/**
* @program: LeetCode
* @description: 快速排序
* @author: CodeDuck
* @create: 2020-07-17 20:23
**/
public class QuickSort {
public static void main(String[] args) {
int[] arr = {6, 7, 18, 3, 5, 4, 10, 9};
quickSort(arr);
for (int a : arr) {
System.out.println(a);
}
}
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
/**
* @Description: 快速排序
* @Param: int[] 数组
*/
private static void quickSort(int[] arr, int left, int right) {
if (left >= right) { // 当满足条件时结束当前递归
return;
}
int i = left; // 左索引
int j = right; // 右索引
// 从数组的最左端开始,选取基准数
int baseNum = arr[left];
// 关于为什么是 右边的 j 先走问题
// 此排序为升序排序,如果 i 先走,走到最后与 j 相遇是主动跑到 j 位置上,而 j 索引的值默认是大于基数的
// 此时的数是大于基数的,不能将此数同基数交换
while (i < j) {
while (arr[j] >= baseNum && i < j) { // 从右至左选择小于基数的数
j--;
}
while (arr[i] <= baseNum && i < j) { // 从左至右选择大于基数的数
i++;
}
if (i < j) {
swap(arr, i, j); // 交换两个数值
}
}
arr[left] = arr[i]; // 将当前 i 与 j 相遇的值与基数交换
arr[i] = baseNum;
quickSort(arr, left, i - 1); // 递归调用基数左边的集合
quickSort(arr, i + 1, right); // 递归调用基数右边的集合
}
/**
* @Description: 交换元素
* @Param: arr 元素组
* @Param: i,j数组下标
* @return: void
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步