基础扩展 | 04. 快速排序算法

Posted 完美Excel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础扩展 | 04. 快速排序算法相关的知识,希望对你有一定的参考价值。

excelperfect

 

快速排序算法是最常用的排序算法,因为其效率高且节省空间。快速排序算法基于一种叫做“二分”的思想,在每次排序时设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边,这样循环交换直至排序完成。

 

例如,要对“61279345108”这10个数进行排序,首先在该序列中任意找一个基准数,如数字6,接着将序列中比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面排列:

3  1 2  5  4  6  9 7  10  8

在初始状态下,数字6在序列的第1位,要将6挪到序列中间的某个位置,假设这相位置是k。现在就是找到这个位置k,以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。这就要通过“交换”的方法来达到目的。将6归位后,序列被分成了以6为界的左右两部分,再用相同的方式处理左边部分的数据与右边部分的数据,将每次的基准数归位,直至全部处理完毕。如果不理解的话,可以参见《啊哈!算法》第1217页中的详细过程解析。

下面是实现快速排序的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—扫一扫下面的二维码