有意思的快速排序法(VBA版本)!
我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务。支持我,也为自己加油!
前面三节分享了冒泡排序法,冒泡排序法是基于数据大小按顺序两两比较大小进行排序,当数据量大的时候,此方法就需要进行很多次循环与比较,运行速度相对较慢。
我们学习这些方法的目的主要是领会其思路,以便在处理实际问题时思路能够更加的宽广和灵活。
今天分享下快速排序法。
快速排序(Quicksort):
其实是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
Option Explicit
Public m&
Sub 排序()
Dim arr() As Long, n%, min&, max&
ReDim arr(1 To 10)
For n = 1 To 10
Cells(1, n).Value =
Next
min = LBound(arr)
max = UBound(arr)
Quicksort arr(), min, max
'导出结果最终结果,验证正确与否
arr =
End Sub
Sub Quicksort(arr() As Long, min As Long, max As Long)
Dim i&, j&, ref&, temp&
'在需要查询的序列起始端和终点端各设置一个哨兵,i,j
i = min
j = max
'取中间位置的值为基准值
ref = arr((min + max) / 2)
'两边哨兵出动开始巡查,相遇后停止巡查
Do
'先出动右边的哨兵,寻找小于等于基准值ref的元素
Do While arr(j) > ref
j = j - 1
Loop
'再出动左边的哨兵,寻找大于等于基准值ref的元素
Do While arr(i) < ref
i = i + 1
Loop
'找到目标值或者相遇后交换其所在位置的值
If i <= j Then
temp = arr(i)
arr(j) =
temp =
'导出以观察结果
m = m + 1
+ 1, 1).Resize(1, 10) = arr
'继续巡查
i = i + 1
j = j - 1
End If
Loop Until i > j
'第一轮巡查完毕,基准值归位,对基准值左右两边的序列分别进行上面的过程,直到排序完毕
If min < j Then Quicksort arr, min, j
If i < max Then Quicksort arr, i, max
End Sub
大家可以在代码中设置断点,一行一行输出,通过本地窗口观察基准值ref,i,j的值,理解递归时处理的是哪部分序列,这样更容易理解快速排序法的原理。
本节的分享就到这里,祝大家每天都有进步。
成为米宏office学堂终身会员有啥好处:
1、米宏云课堂的视频永久免费观看
2、日后录制的视频可以免费观看
3、视频中不懂的可以提问
5、可以帮助解决视频中未提到,文章中未写到的典型问题
点击“阅读原文”,发现惊喜哦!