笔者在学习VB中发现利用集合可以进行排序,优化后比冒泡法快得多。下面是完整的函数代码,演示了如何进行数组的升序或降序排列。

Option Explicit
Dim X(100) As Double
Dim y(100) As String
Private Sub Command1_Click() '演示数字排序
Dim a(100) As Double, z(100) As String, i As Long
For i = 0 To 100
a(i) = X(i) '复制数组
z(i) = CStr(X(i)) '转化为字符串数组
Next
MsgBox Join(z, ","), 64, "原始数组" '显示原始顺序

NUMBERSORT X, "up"
For i = 0 To 100
z(i) = CStr(X(i)) '转化为字符串数组
Next
MsgBox Join(z, ","), 64, "按数字升序排序后数组" '显示排序结果

NUMBERSORT a, "down"
For i = 0 To 100
z(i) = CStr(a(i)) '转化为字符串数组
Next
MsgBox Join(z, ","), 64, "按数字降序排序后数组" '显示排序结果

End Sub
Sub NUMBERSORT(ByRef a() As Double, Optional sort As String = "up") '数字排序
Dim min As Long, max As Long, num As Long, first As Long, last As Long, temp As Long, all As New Collection, steps As Long
min = LBound(a)
max = UBound(a)
all.Add a(min)
steps = 1
For num = min + 1 To max
last = all.Count
If a(num) < CDbl(all(1)) Then all.Add a(num), BEFORE:=1: GoTo nextnum '加到第一项
If a(num) > CDbl(all(last)) Then all.Add a(num), AFTER:=last: GoTo nextnum '加到最后一项

first = 1
Do While last > first + 1 '利用DO循环减少循环次数
temp = (last + first) / 2
If a(num) > CDbl(all(temp)) Then
first = temp
Else
last = temp
steps = steps + 1
End If
Loop
all.Add a(num), BEFORE:=last '加到指定的索引

nextnum:
steps = steps + 1
Next
For num = min To max
If sort = "UP" Or sort = "up" Then a(num) = CDbl(all(num - min + 1)): steps = steps + 1 '升序
If sort = "DOWN" Or sort = "down" Then a(num) = CDbl(all(max - num + 1)): steps = steps + 1 '降序
Next
MsgBox "本数组共经过 " & steps & "步实现" & IIf(sort = "UP" Or sort = "up", "升序", "降序") & "排序!", 64, "INFORMATION"
Set all = Nothing
End Sub

Sub STRINGSORT(ByRef a() As String, Optional sort As String = "UP") '字符串排序
Dim min As Long, max As Long, num As Long, first As Long, last As Long, temp As Long, all As New Collection, steps As Long
min = LBound(a)
max = UBound(a)
all.Add a(min)
steps = 1
For num = min + 1 To max

first = 1
last = all.Count
If a(num) < all(1) Then all.Add a(num), BEFORE:=1: GoTo nextnum '加到第一项
If a(num) > all(last) Then all.Add a(num), AFTER:=last: GoTo nextnum '加到最后一项

Do While last > first + 1 '利用DO循环减少循环次数
temp = (last + first) / 2
If a(num) > all(temp) Then
first = temp
Else
last = temp
steps = steps + 1
End If
Loop
all.Add a(num), BEFORE:=last '加到指定的索引

nextnum:
steps = steps + 1
Next
For num = min To max
If sort = "UP" Or sort = "up" Then a(num) = all(num - min + 1): steps = steps + 1 '升序
If sort = "DOWN" Or sort = "down" Then a(num) = all(max - num + 1): steps = steps + 1 '降序
Next
MsgBox "本数组共经过 " & steps & "步实现" & IIf(sort = "UP" Or sort = "up", "升序", "降序") & "排序!", 64, "INFORMATION"
Set all = Nothing
End Sub

Private Sub Command2_Click() '演示字符串排序
Dim z(100) As String, i As Long '复制数组
For i = 0 To 100
z(i) = y(i)
Next

MsgBox Join(y, ","), 64, "原始数组" '显示原始顺序

STRINGSORT y, "UP"
MsgBox Join(y, ","), 64, "按字符串升序排序后数组" '显示排序结果

STRINGSORT z, "DOWN"
MsgBox Join(z, ","), 64, "按字符串降序排序后数组" '显示排序结果
End Sub

Private Sub Command3_Click() ' 排序计时
Dim a(3000) As String, i As Long, starttime As Long, endtime As Long
For i = 0 To 3000
a(i) = Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) '生成随机6字符的字符串
Next
starttime = Timer '计时开始
STRINGSORT a
endtime = Timer '计时结束
MsgBox "排序共耗时 " & endtime - starttime & " 秒!"
End Sub

Private Sub Form_Load()
Randomize
Dim i As Long
For i = 0 To 100
X(i) = Format(Rnd * 1000, "0.00")
y(i) = Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65) & Chr(Int(Rnd * 26) + 65)
Next
End Sub

利用集合进行数组的排序相关推荐

  1. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...

  2. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  3. Julia程序设计3 数组2 排序、复制、集合运算、字典

    Julia程序设计3 数组2 排序.复制.集合运算.字典 排序 排序算法 查找数组中的元素 复制数组 for语句实现数组的变换与生成 集合运算 字典 创建字典 查阅字典 查看索引 修改字典 添加.删除 ...

  4. 利用指针及数组对国家名称按字典排序

    /************************* 利用指针及数组对国家名称按字典排序 **********************/ #include <stdio.h> #inclu ...

  5. 利用js写一个函数,实现翻转任意数组。 写一个函数,实现对数字数组的排序。

    1.写一个函数,实现翻转任意数组 function reverse(arr) {var newArr = [];for (var i = arr.length - 1; i >= 0; i--) ...

  6. 利用jQuery对无序列表排序 http://www.apkbus.com/android-80639-1-1.html

    利用jQuery对无序列表排序的原理是:获取到无序列表中的所有列表项,并转成数组形式,使用JavaScript函数对其进行排序后再次输出.其中使用到的jQuery函数有ready().get().te ...

  7. 督促自己——某客网编程题三道(Java)——字符串、集合、数组

    某客网编程题三道(Java)--字符串.集合.数组 第一题: 题目描述 找出字符串中第一个只出现一次的字符 输入描述: 输入几个非空字符串 输出描述: 输出第一个只出现一次的字符,如果不存在输出-1 ...

  8. java集合和数组随你转换_java集合和数组互相转换

    // 抽时间多了解集合框架和数组,不能只要是数组就会写ArrayList,碰到键值对就是HashMap // 每次用到集合,我们都要像小和尚念经般的熟悉下面内容: a) List Set Map是集合 ...

  9. Java学习 --集合和数组

    集合和数组: 都是对多个数据进行存储操作的结构,加成java容器. 数组存储的特点: 一旦初始化以后,长度就确定了,元素类型也就确定了.对于指定一个数组,我们只能操作指定类型的数据. 数组存储数据是有 ...

最新文章

  1. ansible的安装和ansible的模板
  2. 天大18年c语言离线作业,天大18秋C语言程序设计在线作业一辅导资料.docx-资源下载在线文库www.lddoc.cn...
  3. 微软人工智能和对话平台--知识商城体验
  4. 空间换时间,查表法的经典例子
  5. 新买的衣服一定要洗吗?不洗就穿对身体不好吗?
  6. 检查java程序假死的脚本
  7. Win10将引入HomeHub功能 和Google Home和Amazon Echo竞争
  8. javax.servlet.http.HttpServletResponse.setContentLengthLong(J)V,maven项目报错!!无法访问webapp下的文件,完美解决方案
  9. DreamWeaver CC网页设计与制作
  10. Echarts实现数据可视化大屏
  11. rpm的mysql怎么安装_MySQL的rpm安装教程
  12. js 时区对应的时间转换
  13. 利用c++深究周立功usbcan盒的学习
  14. [乐意黎原创]访问Centos下Apache主机页面抛You don't have permission to access / on this server.
  15. C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息
  16. Dio 中的拦截器原来有这些用法
  17. 186、商城业务-检索服务-页面分页数据渲染
  18. Swagger (YAML OpenAPI) 从放弃到入门
  19. 中学计算机课外小组活动计划,课外活动计划实施方案
  20. linux系统装fluent没有界面,linux下Fluent的安装

热门文章

  1. eclipse的安装和汉化
  2. sort函数数组排序(c++方法)
  3. hdu 1789题解
  4. web开发第三方登陆之google+登陆
  5. C++ PAT甲级 1050 String Subtraction (20分)
  6. 计算机许可管理器服务器名称是什么意思,部署 - 安装后的许可证服务器是什么?...
  7. CART算法(机器学习)
  8. Neural Tangent Kernel 理解(一)原论文解读
  9. python 函数的使用方法
  10. 万能密码:‘or 1=1-- 实战SQL注入,秒破后台