除非注明,文章均为 战战如疯 原创,转载请保留链接: 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。
|