Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2758|回复: 1

跟着校长学VBA之第25集:VBA数组6之排序算法(上)

[复制链接]
发表于 2013-1-16 14:43 | 显示全部楼层 |阅读模式
本帖最后由 hwc2ycy 于 2013-1-16 15:56 编辑

一、冒泡法排序
      冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
       由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
  1. Sub 冒泡排序()
  2.     Dim arr, temp, x, y, t, k
  3.     t = Timer
  4.     arr = Range("a1:a10")
  5.     For x = 1 To UBound(arr) - 1
  6.         For y = x + 1 To UBound(arr)    '只和当前数字下面的数进行比较
  7.             If arr(x, 1) > arr(y, 1) Then    '如果它大于它下面某一个数字
  8.                 temp = arr(x, 1)
  9.                 arr(x, 1) = arr(y, 1)
  10.                 arr(y, 1) = temp
  11.             End If
  12.         Next y
  13.     Next x
  14.     Range("b3").Resize(x) = ""
  15.     Range("b3").Resize(x) = arr
  16.     MsgBox Timer - t
  17. End Sub
复制代码
二、选择排序法
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
  1. Sub 选择排序()
  2.     Dim arr, temp, x, y, iMax, k, k1, k2
  3.     arr = Range("a1:a10")
  4.     For x = UBound(arr) To 1 + 1 Step -1
  5.         iMax = 1    '最大的索引
  6.         For y = 1 To x
  7.             If arr(y, 1) > arr(iMax, 1) Then iMax = y
  8.         Next y
  9.         temp = arr(iMax, 1)
  10.         arr(iMax, 1) = arr(x, 1)
  11.         arr(x, 1) = temp
  12.     Next x
  13.     Range("c1").Resize(UBound(arr)) = arr
  14. End Sub
复制代码
关于排序算法的稳定性之说大家可以百度下。
这里就不贴地址了。

发表于 2014-1-4 22:24 | 显示全部楼层
额,您给的课件里把最后面的结果输出给注释了,我整了半天都不知道哪有问题,一直搞不懂iMax是个什么意思?还有,上边那种声明变量的方式没有问题吗?是不是我以后都可以这样声明变量了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-6 08:47 , Processed in 0.197972 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表