ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9324|回复: 14

一个纯数字字符串的冒泡排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-7-14 14:33 | 显示全部楼层 |阅读模式
本帖最后由 sealand71 于 2016-7-14 15:26 编辑

一个字符串,如34681479345803782369,请问要怎么样对它进行冒泡排序呢,我试了好久都搞不好,请大师帮帮忙,谢谢。
字符串长度固定20位

如附件,A1单元格为原始数据,A3单元格为需要的效果,请大师帮忙,谢谢

排序示例.rar

6.45 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2016-7-14 14:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
冒泡排序,百度一搜一大堆
For i = 1 To n - 1
For j = 1 To n-i
If a(j) > a(j+1) Then
temp=a(j): a(j)=a(j+1): a(j+1)=temp
End if
Next j
Next i

TA的精华主题

TA的得分主题

发表于 2016-7-14 15:20 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-14 15:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
已修复,请帮我看一下

排序示例.rar

6.45 KB, 下载次数: 19

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-14 15:26 | 显示全部楼层

附件已修复,请帮我看一下,谢谢

TA的精华主题

TA的得分主题

发表于 2016-7-15 11:27 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-16 17:54 | 显示全部楼层
谢谢,你这种方法稍微复杂一点,我无法理解,不过还是谢谢你

TA的精华主题

TA的得分主题

发表于 2016-7-16 20:19 | 显示全部楼层
sealand71 发表于 2016-7-16 17:54
谢谢,你这种方法稍微复杂一点,我无法理解,不过还是谢谢你

纯数字字符串的排序,可以通过定义数组a(9)来记录数字并得到自然的排序结果,
即:数组a的0-9位置下标,可作为自然排序的指针,无需单独进行一个排序过程。

例如: 32198 排序过程:
定义a(9) 结果为 --------- (这里以-代替空白)
取3 存入数组得到  ---3------
取2 存入数组得到  --23------
取1 存入数组得到  -123------
取9 存入数组得到  -123-----9
取8 存入数组得到  -123----89

因此,尽管按原数值字符串先后顺序读取到的结果是乱序的,
但存入a(9)数组后自然就得到了按数字顺序(其实也是数组a的下标顺序)的排序结果。

就是这么简单、高效!

写成自定义函数的代码示例:
  1. Function f(t)
  2.     Dim a(9)
  3.     For i = 1 To Len(t)
  4.         s = Mid(t, i, 1)
  5.         a(s) = a(s) & s
  6.     Next
  7.     f = Join(a, "")
  8. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-7-16 20:21 | 显示全部楼层
另外,如果是任意文本字符串,则无法用定义数组a(9)的方法来排序,
只有通过比较排序来完成。

以下是我写的逐个插入比较排序代码。
过程稍复杂,但效率比冒泡排序高一些。

  1. Function f(t) '本排序方法可以对任意字符串进行逐个排序,不比限制对象为数值串
  2.     l = Len(t) '字符串长度l
  3.     ReDim a(l - 1) '定义存放排序结果的数组a
  4.     For i = 1 To l '遍历字符串中每个字符
  5.         s = Mid(t, i, 1) '提取i位置该字符s
  6.         For j = 0 To n   '从低位开始把已排序的n个结果依次和s作比较(n起始=0)
  7.             If a(j) > s Then '如果当前j位置值已经比该字符s更大则不用继续比了 说明s就该排序在这个j位置
  8.                 For k = n To j + 1 Step -1 '把当前j位置开始所有比s更大的值 倒序向后移动1个位置以便腾出当前j为空位
  9.                     a(k) = a(k - 1) '依次倒序向后移动1个位置
  10.                 Next
  11.                 a(k) = s '腾出的当前j空位写入s 完成s的排序
  12.                 Exit For '退出本次s值的检查比较
  13.             End If
  14.         Next
  15.         If j > n Then a(j - 1) = s '如果检查到n都没有比s值更大的值,则s为最大值应该在最后位置写入s
  16.         n = n + 1 '记录已经完成排序的个数(位置)
  17.     Next
  18.     f = Join(a, "") '完成所有值的比较排序 输出合并字符串
  19. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-7-16 21:13 | 显示全部楼层
下面介绍正宗的冒泡算法排序:

  1. Function f(t) '本方法采用冒泡排序算法可以对任意字符串进行逐个排序,不比限制对象为数值串
  2.     l& = Len(t) '字符串长度l
  3.     ReDim a(1 To l) '定义存放排序结果的数组a
  4.     For i = 1 To l '遍历字符串中每个字符
  5.         a(i) = Mid(t, i, 1) '提取i位置该字符s 写入待排序的数组a
  6.     Next
  7.     Call BubbleSortA(a, 1, l) '调用冒泡排序算法函数过程
  8.     f = Join(a, "") '完成所有值的比较排序 输出合并字符串
  9. End Function

  10. Sub BubbleSortA(tr, l&, u&) '上浮冒泡算法
  11.     Dim i&, j&, t$
  12.     For i = l To u - 1 '检查每一个值
  13.         For j = u To i + 1 Step -1 '从底部开始倒序检查到已完成排序的i+1位置
  14.             If tr(j) < tr(j - 1) Then t = tr(j): tr(j) = tr(j - 1): tr(j - 1) = t
  15.             '如当前值较小就向前交换位置完成一对数的排序交换 看上去较小的数会不断冒泡向上浮动
  16.         Next
  17.     Next
  18. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 10:51 , Processed in 0.039692 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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