java实现快速排序

195 阅读2分钟

前言

兵贵神速,快速排序!几大非常重要的排序算法(快速排序、归并排序、堆排序)最好能一一掌握,哪怕其余的会忘记也没关系。下面稍微介绍下快速排序并给出相应实现!

思路整理

image.png 上图摘自趣学算法,快排的威力显而易见。下面的图解基本取自啊哈算法:

假设现在要排序的序列是: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

图解:

image.png

image.png

image.png

全流程图解如下;

image.png

算法实现

算法与语言无关,咱们就用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);
        }
    }

}