打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA数组之快速排序
userphoto

2023.04.10 北京

关注

1.什么是快速排序

快速排序是效率较高的排序算法之一。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分

2.算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照快速排序的思想,我们先选择一个基准元素,进行排序


我们选取4为我们的基准元素,并设置基准元素的位置为index,设置两个指针left和right,分别指向最左和最右两个元素


接着,从right指针开始,把指针所指向的元素和基准元素做比较,如果比基准元素大,则right指针向左移动,如果比基准元素小,则把right所指向的元素填入index中

3和4比较,3比4小,将3填入index中,原来3的位置成为了新的index,同时left右移一位

然后,我们切换left指针进行比较,如果left指向的元素小于基准元素,则left指针向右移动,如果元素大于基准元素,则把left指向的元素填入index中

5和4比较,5比4大,将5填入index中,原来5的位置成为了新的index,同时right左移一位

接下来,我们再切换到right指针进行比较,6和4比较,6比4大,right指针左移一位

2和4比较,2比4小,将2填入index中,原来2的位置成为新的index,left右移一位

随着left右移,right左移,最终left和right重合

此时,我们将基准元素填入index中,这时,基准元素左边的都比基准元素小,右边的都比基准元素大,这一轮交换结束

第一轮,基准元素4将序列分成了两部分,左边小于4,右边大于4,第二轮则是对拆分后的两部分进行比较

此时,我们有两个序列需要比较,分别是3、2、1和7、8、6、5,重新选择左边序列的基准元素为3,右边序列的基准元素为7

第二轮排序结束后,结果如下所示

此时,3、4、7为前两轮的基准元素,是有序的,7的右边只有8一个元素也是有序的,因此,第三轮,我们只需要对1、2和5、6这两个序列进行排序

第三轮排序结果如下所示

至此所有的元素都是有序的

3.代码实现

Sub QuickSort(arr() As Variant, low As Integer, high As Integer) If low < high Then Dim pivot As Variant, i As Integer, j As Integer, temp As Variant pivot = arr(high) '指定基准数 i = low - 1 For j = low To high - 1 If arr(j) <= pivot Then i = i + 1 temp = arr(i) arr(i) = arr(j) arr(j) = temp End If Next j temp = arr(i + 1) arr(i + 1) = arr(high) arr(high) = temp QuickSort arr, low, i QuickSort arr, i + 2, high End IfEnd SubSub test()Dim i, arr(1 To 10)For i = 1 To 10 arr(i) = Int(Rnd * 100 + 1)Next iDebug.Print 'Original Data: ' & Join(arr, ',') '输出原始数据QuickSort arr, 1, 10Debug.Print 'After Sort: ' & Join(arr, ',') '输出排序后的数据End Sub

4.结果输出

Original Data: 5,42,87,80,38,97,88,6,95,37After Sort: 5,6,37,38,42,80,87,88,95,97

好了,今天的分享就到这里了,我们下期再见

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[PHP] 算法
5分钟搞定快速排序
面试中的排序算法总结
❤️全面图解快速排序,详细图文并茂解析!❤️
Java实现几种常见排序方法
算法系列: 10大常见排序算法: 快速排序法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服