希望你能理解的快速排序 --- 用12张图 细节图解快速排序 !!

本文深入解析快速排序算法,通过12张图详细展示排序过程。快速排序是一种高效的排序算法,其核心在于选择一个基准值,将数组分为两部分,一部分的所有元素都比另一部分的元素小。文章通过具体的步骤和实例,帮助读者理解快速排序的实现原理。

首先说一下快排的基本概念,从一个数组里面选一个基础值,然后将数组里所有大于这个基础值的数放到右边小于这个基础值的放到左边

结合着以下观念看下方12张图,理解具体如何实现(可以先看图)

  1. 将数组的第一个值8,拿出来,作为基础值,并存储到变量number中,让arr[0]空出来以供插入。
  2. 从右往左开始比,是因为左边arr[0]空了出来,右边要是有比number(也就是8)大的数字,就可以直接移动到arr[0] (如图3,图4)。
  3. 下标移动只有在: (如图5, 图6)
    a. 下标比number
    b. 下标比number
  4. 否则,不进行移动,如 : (如图3,4 和 图7,8)
    a. 右下标比numbe小,则将右下标所指的值,给到左下标指的值,此时,右下标空出,不可移动,供左下标出现大于number时移动。
    b. 左下标比number大,则将左下标所致的值,给到右下标的值,此时,左下标空出,不可移动,供右下标出现小于number时移动。
  5. 当左右下标相等时,此时由前面四点得,左右下标所指的值,应该是空出的,将number放入,就形成了左边都比number小,右边都比number大; (如图11,,12);

图1--------------------------------------------------------------

在这里插入图片描述

图2--------------------------------------------------------------

在这里插入图片描述

图3--------------------------------------------------------------

在这里插入图片描述

图4--------------------------------------------------------------

在这里插入图片描述

图5--------------------------------------------------------------

在这里插入图片描述

图6--------------------------------------------------------------

在这里插入图片描述

图7--------------------------------------------------------------

在这里插入图片描述

图8--------------------------------------------------------------

在这里插入图片描述

图9--------------------------------------------------------------

在这里插入图片描述

图10--------------------------------------------------------------

在这里插入图片描述

图11--------------------------------------------------------------

在这里插入图片描述

图12--------------------------------------------------------------

在这里插入图片描述

function quicksort(arr: number[]): number[] {
    if (arr.length === 0 || arr.length === 1) {
        return arr;
    }
    if (arr.length === 2) {
        arr[0] > arr[1] && ([arr[0], arr[1]] = [arr[1], arr[0]]);
        return arr;
    }
    let number = arr[0];
    let change = 0;
    let left = 0;
    let right = arr.length - 1;
    let s = 0;
    while (left < right) {
        while (s === 0) {
            if (arr[right] < number && left < right) {
                arr[change] = arr[right];
                change = right;
                s = 1;
                break;
            }
            if (left === right) {
                arr[change] = number;
                break;
            }
            right--;
        }
        while (s === 1) {
            if (arr[left] > number && left < right) {
                arr[change] = arr[left];
                change = left;
                s = 0;
                break;
            }
            if (left === right) {
                arr[change] = number;
                break;
            }
            left++;
        }
    }
    return [
        ...quicksort(arr.slice(0, change)),
        number,
        ...quicksort(arr.slice(change + 1)),
    ];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值