我理解的快速排序

本文详细解析了快速排序的原理,通过对比冒泡排序,阐述了其利用基准数和跳跃式交换优化效率的过程。核心步骤包括选取基准、左右指针扫描与交换,直至数组部分排序。代码实例展示了如何用JavaScript实现快速排序。
摘要由CSDN通过智能技术生成

为了方便理解,先设定个数组,如  let arr = [73, 125, 34, 45, 506, 44, 66, 77, 88, 99];

排序过程中可以对照数组验证。

快速排序的核心思想就是,先取一个基准数,再把比它小的数放它左边,比它大的放右边

通常为了方便起见取第一个数为基准数,那么我们现在的目标就是把这个数放到某个位置,假定这个位置是k,k之前的数字要比它小,之后的数字比它大。

我们要知道冒泡排序是通过相邻两个数字进行比较排序的,这样效率较低。快速排序就是对其进行改进。

而快速排序是分别从两边开始的,先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换它们。为了实现这一功能,我们把我们的老朋友变量i和j请出来,让i的初始位置在最左边(begin),j的初始位置在最右边(end)。

按照规则,j先出发,从右往左找,如果数字大于基准数就继续找下一个(j--),直到碰到比基准数小的数。

j找到数字后,i出发,从左往右找,数字小于基准数就找下一个(i++),直到碰到比基准数大的数。在它们都找到自己的数字时,开始进行交换,实现比基准数小的数去左边,大的去右边。

第一次交换结束后进行循环进行第二次、第三次.....,直到i与j相遇(即i = j),在i = j的位置就是我们要找的基准数放置的位置k,在k左边都比它小,k右边都比它大。

第一轮排序结束,现在我们得到了k的位置,且k左边的数字比它小,右边比它大,那么二轮排序我们在k的左边(begin,k - 1)进行如上操作,k的右边(k + 1,end)也进行如上操作开始循环,直到begin >= end (也就是i >= j)时结束结束循环。

实现代码如下:

        function quickSort(arr, begin, end) {
            if (begin >= end) return;
            let temp = arr[begin];
            let i = begin;
            let j = end;
            while (i < j) {
                while (arr[j] >= temp && j > i) {
                    j--
                }
                while (arr[i] <= temp && j > i) {
                    i++
                }
                if (j > i) {
                    let t = arr[i]
                    arr[i] = arr[j]
                    arr[j] = t
                }
            }
            arr[begin] = arr[i]
            arr[i] = temp
            quickSort(arr, begin, i - 1)
            quickSort(arr, i + 1, end)
        }
        let arr = [73, 125, 34, 45, 506, 44, 66, 77, 88, 99];
        quickSort(arr, 0, 9)
        console.log(arr)

快速排序每次进行排序时都会设定一个基准数进行比较排列,每次交换是跳跃式的,总的比较和交换次数少了,速度自然就提高了。当然最坏的情况是,全都是相邻的两个数进行了交换。但快速排序最差的情况效率和冒泡排序相同,一般情况的话效率是比冒泡排序高的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地狱三头猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值