分享

一维数组排序

 gblhp 2015-02-16

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www./cat4/446.html,VBA交流群273624828。

这节来看下排序的问题。以一维数组排序为例,现在我有一个纯数字的一维数组,要将数组按升序重新排列,这里我们以冒泡排序法来解决这个问题。

所谓冒泡排序就是从前往后将相邻两个数依次比较,如果后面的比前面的大就将两个数交换位置。如果数组里有n个数,那原则上最多循环n-1次就可以实现排序了。下面来看一个实例演示。

Sub 冒泡排序()
Dim arr, i, j, n, temp, flag As Boolean
Cells.ClearContents
arr = Array(5, 2, 4, 3, 7, 1)  '定义一个一维数组,6项,下标从0开始,最大下标5
[a1].Resize(6, 1) = Application.Transpose(arr)  '放了A列,以便演示
For j = 1 To UBound(arr)   '这里就是代表循环5次
For i = 0 To UBound(arr) - j   '第一次对前6个比较,第二次只需前5个比较,依次类推
If arr(i) > arr(i + 1) Then  '如果前面比后面大就交换位置
temp = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = temp
End If
Next
n = n + 1
Cells(1, n + 1).Resize(6, 1) = Application.Transpose(arr)
Next
End Sub

上面就是冒泡排列的基本原理,可以看下表格里,每一列就是每一次排序的结果。

当然这个过程还可以优化,可以想到如果某一次循环中没有发生交换,那这个排序就完成了,没有必要再运行下面的过程了,那我们设一个标记,如果发生交换这个标记设一个值,没有交换另一个值,判断这个标记我们就知道排序完成没有。看代码

Sub 冒泡排序2()
Dim arr, i, j, n, temp, flag As Boolean
Cells.ClearContents
flag = True
arr = Array(1, 2, 4, 3, 7, 5)
[a1].Resize(6, 1) = Application.Transpose(arr)
Do While flag = True
i = i + 1
flag = False
For j = 0 To UBound(arr) - i
If arr(j) > arr(j + 1) Then
flag = True
temp = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = temp
End If
Next
Cells(1, i + 1).Resize(6, 1) = Application.Transpose(arr)
Loop
End Sub

上面的代码设了一个标记flag,循环的开头将flag设为flase,如果中间发生交换就将flag设为true,下次循环前先判断flag是否为true,如果是true就循环,不是的话就跳出循环可以了。

本节示例文件下载地址:http://pan.baidu.com/s/1c0q2tnq

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多