基础扩展 | 04. 快速排序算法
Posted 完美Excel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础扩展 | 04. 快速排序算法相关的知识,希望对你有一定的参考价值。
excelperfect
快速排序算法是最常用的排序算法,因为其效率高且节省空间。快速排序算法基于一种叫做“二分”的思想,在每次排序时设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边,这样循环交换直至排序完成。
例如,要对“6、1、2、7、9、3、4、5、10、8”这10个数进行排序,首先在该序列中任意找一个基准数,如数字6,接着将序列中比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面排列:
3 1 2 5 4 6 9 7 10 8
在初始状态下,数字6在序列的第1位,要将6挪到序列中间的某个位置,假设这相位置是k。现在就是找到这个位置k,以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。这就要通过“交换”的方法来达到目的。将6归位后,序列被分成了以6为界的左右两部分,再用相同的方式处理左边部分的数据与右边部分的数据,将每次的基准数归位,直至全部处理完毕。如果不理解的话,可以参见《啊哈!算法》第12至17页中的详细过程解析。
下面是实现快速排序的VBA示例代码。
Sub testquicksort()
'声明变量
Dim myarr(10) As Long
Dim i As Integer
'给数组赋值
myarr(0) = 6
myarr(1) = 1
myarr(2) = 2
myarr(3) = 7
myarr(4) = 9
myarr(5) = 3
myarr(6) = 4
myarr(7) = 5
myarr(8) = 10
myarr(9) = 8
'调用快速排序过程
quicksort arr:=myarr,left:=0, right:=9
'打印排序结果
For i = 0 To 9
Debug.Print myarr(i)
Next i
End Sub
Sub quicksort(ByRef arr() As Long, left As Integer, right AsInteger)
'声明变量
Dim i As Integer, j AsInteger
Dim t As Long, temp AsLong
'如果超过了界限,则退出
If (left > right) Then
Exit Sub
End If
'存放基准值
temp = arr(left)
i = left
j = right
Do While (i <> j)
'先从右往左找
Do While ((arr(j)>= temp) And (i < j))
j = j - 1
Loop
'再从左往右找
Do While ((arr(i)<= temp) And (i < j))
i = i + 1
Loop
'交换两个数在数组中的位置
If (i < j) Then
t = arr(i)
arr(i) = arr(j)
arr(j) = t
End If
Loop
'将基准值归位
arr(left) = arr(i)
arr(i) = temp
'继续处理左边的,这是一个递归过程
Call quicksort(arr(), left,i - 1)
'继续处理右边的,这是一个递归过程
Call quicksort(arr(), i +1, right)
End Sub
结果如下图1所示。
图1
欢迎分享本文,转载请注明出处。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
方法1—在微信“添加朋友”或者通讯录中搜索“完美Excel”或者“excelperfect”后点击关注。
方法2—扫一扫下面的二维码
以上是关于基础扩展 | 04. 快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章