前言
兵贵神速,快速排序!几大非常重要的排序算法(快速排序、归并排序、堆排序)最好能一一掌握,哪怕其余的会忘记也没关系。下面稍微介绍下快速排序并给出相应实现!
思路整理
上图摘自趣学算法,快排的威力显而易见。下面的图解基本取自啊哈算法:
假设现在要排序的序列是:3 1 2 5 4 6 9 7 10 8 点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢?
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这 10 个数进行排序。首先在这个序列中随
便找一个数作为基准数(不要被这个名词吓到了,这就是一个用来参照的数,待会儿你就知
道它用来做啥了)。为了方便,就让第一个数 6 作为基准数吧。接下来,需要将这个序列中
所有比基准数大的数放在 6 的右边,比基准数小的数放在 6 的左边,类似下面这种排列。
3 1 2 5 4 6 9 7 10 8
图解:
全流程图解如下;
算法实现
算法与语言无关,咱们就用java看下快速排序怎么玩。
package com.cmdc.all.suanfa;
/**
* @author : wuwensheng
* @date : 17:11 2021/11/30
*/
public class Test {
private static void quickSort(int[] array, int left, int right) {
int i, j, t, temp;
if (left > right) {
return;
}
// temp中存的就是基准数
temp = array[left];
i = left;
j = right;
while (i != j) {
// 顺序很重要,要先从右往左找
while (array[j] >= temp && i < j) {
j--;
}
//再从左往右找
while (array[i] <= temp && i < j) {
i++;
}
// 交换两个数在数组中的位置
// 当哨兵i和哨兵j没有相遇时
if (i < j) {
t = array[i];
array[i] = array[j];
array[j] = t;
}
}
//最终将基准数归位
array[left] = array[i];
array[i] = temp;
// 继续处理左边的
quickSort(array, left, i - 1);
// 继续处理右边的
quickSort(array, i + 1, right);
}
public static void main(String[] args) {
int[] array = {-11, 6, -444, 1, 2, 7, -23, 9, 88, 3, 4, 5, 999, 10, 8};
quickSort(array, 0, array.length - 1);
for (int i : array) {
System.out.println(i);
}
}
}