开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 420|回复: 12
收起左侧

[已解决] 数组排序有一个地方,理解不透,望详细告知

 关闭 [复制链接]
结帖率:100% (2/2)
发表于 2024-9-10 04:22:23 | 显示全部楼层 |阅读模式   江苏省扬州市
30精币
111.bmp

图中划线地方 ,取数组成员数  减去  i   是什么意思?(具体起到什么作用?)  我试了不减i 或 +i  都会出错
222.bmp

最佳答案

查看完整内容

有这个疑问,说明你其实并不明白冒泡排序是怎么回事,或者说处在一种似懂非懂的状态,好像懂了,又好像没有。 首先我们来看看什么是排序: 把 {40 30 20 25 21} 变成 1、{20 21 25 30 40} 或者 2、{40 30 25 21 20} 我们称之为排序,也就是按顺序排列。 现在我们不考虑怎么用程序实现,而是分析之前的思考过程,看看它是怎么帮我们完成手工排序的。 面对 {40 30 20 25 21} 我会先找到其中的最大数,放到最后,变成: {30 20 25 21 | ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (1/1)
发表于 2024-9-10 04:22:24 | 显示全部楼层   浙江省温州市
有这个疑问,说明你其实并不明白冒泡排序是怎么回事,或者说处在一种似懂非懂的状态,好像懂了,又好像没有。
首先我们来看看什么是排序:

{40 30 20 25 21}
变成
1、{20 21 25 30 40}
或者
2、{40 30 25 21 20}
我们称之为排序,也就是按顺序排列。
现在我们不考虑怎么用程序实现,而是分析之前的思考过程,看看它是怎么帮我们完成手工排序的。
面对
{40 30 20 25 21}
我会先找到其中的最大数,放到最后,变成:
{30 20 25 21 | 40}
然后以此类推
{20 25 21 | 30 40}
{20 21 | 25 30 40}
{20 | 21 25 30 40}
{| 20 21 25 30 40}
这样排序就算完成了。
这时再回到你的问题,“- i” 的目的已经显而易见。
就像我们在上面完成手工排序的过程一样,它的目的是为了缩小判断的范围,即 | 右边的是已经排序好了的,没必要再去判断。
体现在冒泡排序中的好处是减少了循环次数,比如有1百个数,不进行范围缩小,需要循环1万次,而缩小后,只需要5千次,这提高了运行速度,是一种很常见的冒泡排序优化措施。

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:67% (2/3)

签到天数: 9 天

发表于 2024-9-10 04:43:21 | 显示全部楼层   河南省平顶山市
谁教你这样写的

补充内容 (2024-9-10 04:50):
数组_排序(, , )。比如数组成员有三个你引用第四个能不报错嘛,直接用精易的数组排列就行了,没必要这么麻烦
回复

使用道具 举报

结帖率:100% (12/12)
发表于 2024-9-10 07:16:48 | 显示全部楼层   河北省邯郸市
计次循环首() i  和 a  
都是1开始计算。
循环四次 是1.2.3.4
数组成员数的标记是 -1.1.2.3
也就算说 ,数组4个成员数里面没有第四个成员,最大只有   数组[3]。 这句话是核心)
回复

使用道具 举报

结帖率:90% (18/20)
发表于 2024-9-10 07:53:22 | 显示全部楼层   福建省泉州市
计次循环的数值循环是从1开始的,数组的索引是从0开始的,所以要减去1,不然到最后一个就会超索引,超索引就会报这个错误

点评

我记错了,记成其他语言了,不好意思不好意思   福建省泉州市  发表于 2024-9-10 10:29
数组的索引是从0开始的?????   福建省泉州市  发表于 2024-9-10 10:26
回复

使用道具 举报

结帖率:78% (18/23)

签到天数: 9 天

发表于 2024-9-10 09:26:36 | 显示全部楼层   浙江省嘉兴市
下面的是从一个源码里剥离下来的,应该能行的。
  
变量名类 型静态数组备 注
数组整数型5
i  
n  
temp整数型 
数组 = { 40, 30, 20, 25, 21 }
计次循环首 (5 - 1, i)
变量循环首 (5, i + 1, -1, n)
如果真 (数组 [i] < 数组 [n])
交换变量 (数组 [i], 数组 [n])

变量循环尾 ()
计次循环尾 ()
调试输出 (数组)


i支持库列表   支持库注释   
spec特殊功能支持库

点评

有没有一种可能,他只是想理解、读懂冒泡排序这个代码,而不是想要一个排序方案   福建省泉州市  发表于 2024-9-10 10:43
回复

使用道具 举报

结帖率:100% (18/18)

签到天数: 20 天

发表于 2024-9-10 10:43:21 | 显示全部楼层   福建省泉州市
  
变量名类 型静态数组备 注
数组整数型0
n整数型 
a整数型 
计次循环首 (取数组成员数 (数组), n)
计次循环首 (取数组成员数 (数组) - n, a)
如果真 (数组 [a] > 数组 [a + 1])
交换变量 (数组 [a], 数组 [a + 1])

计次循环尾 ()
计次循环尾 ()
' 首先,看内层循环,因为引用数组成员最大引用了a+1,这时候就要保证a的最大值必须是小于数组成员数最少1
' 这时候我们的代码应该为:
. ' 计次循环首 (取数组成员数 (数组), n)
. ' 计次循环首 (取数组成员数 (数组) - 1, a)
. ' 如果真 (数组 [a] > 数组 [a + 1])
' 交换变量 (数组 [a], 数组 [a + 1])

. ' 计次循环尾 ()
. ' 计次循环尾 ()
' 然后,按着上述代码流程逐步跟进,会发现外层循环每次循环一遍,最小的值都会被往后挪到数组下标最大的位置
' 而第一次循环之后,最小的值已经被挪到最右边了,
' 第二次循环时第二小的值在内层循环第(取数组成员数 (数组) - 1)次循环时会被挪到数组右数第二的位置,
' 此时最后一次循环跟右边比它小的值对比完全就是多余的操作了
' 所以外层循环的第二次循环,内层循环的总次数要再减去1,能减少冗余的循环次数
' 然后,外层循环第三次循环,你会发现,内层循环冗余的循环次数又多了1
' 这时总结一下规律,发现外层循环每次循环,内层循环总循环次数都递减一次,就可以去除这些冗余的循环操作
' 此时,每次外层循环时,内层循环的总次数依次是[取数组成员数 (数组)-1][取数组成员数 (数组)-2]……[取数组成员数 (数组)-取数组成员数 (数组)]
' 而外层循环的循环变量n的值,随着循环从1开始每次递增1,一直到取数组成员数 (数组)
' 所以就可以用n完美替代
' 最终的代码就变成了最上边的样子

评分

参与人数 1精币 +1 收起 理由
hscd + 1 新技能已get√

查看全部评分

回复

使用道具 举报

结帖率:81% (17/21)

签到天数: 1 天

发表于 2024-9-10 10:50:57 | 显示全部楼层   广东省中山市
最好别这样写,乱七八糟的,数组从1开始的
回复

使用道具 举报

结帖率:100% (53/53)
发表于 2024-9-10 11:55:23 | 显示全部楼层   福建省宁德市
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  

子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
数组整数型0
数组 = { 40, 30, 20, 25, 21 }
冒泡排序_基础 (数组)
调试输出 (数组)
子程序名返回值类型公开备 注
冒泡排序_基础  
参数名类 型参考可空数组备 注
数组整数型
变量名类 型静态数组备 注
成员数整数型 
i整数型 
是否有交换过变量逻辑型 
成员数 = 取数组成员数 (数组)
循环判断首 ()
是否有交换过变量 = 假
变量循环首 (1, 成员数 - 1, 1, i)
' 为啥 成员数 - 1
' 当前值 = 数组[i]
' 下个值 = 数组[i+1]
' 可以看出是【当前值】和【下个值】比较
' 也就是【下个值】是预读的,如果成员数不减1
' 预读  【下个值】就会超过成员数,就会报错
如果真 (数组 [i] > 数组 [i + 1])
交换变量 (数组 [i], 数组 [i + 1])
是否有交换过变量 = 真

变量循环尾 ()
循环判断尾 (是否有交换过变量 = )
' 冒泡排序过程
' 数组 = { 40, 30, 20, 25, 21 }
' 第一遍排序
' 40 > 30,结果 = { 30, 40, 20, 25, 21 }
' 40 > 20,结果 = { 30, 20, 40, 25, 21 }
' 40 > 25,结果 = { 30, 20, 25, 40, 21 }
' 40 > 21,结果 = { 30, 20, 25, 21, 40 }
' 是否有交换过变量 = 真
' 第二遍排序
' 30 > 20,结果 = { 20, 30, 25, 21, 40 }
' 30 > 25,结果 = { 20, 25, 30, 21, 40 }
' 30 > 21,结果 = { 20, 25, 21, 30, 40 }
' 30!> 40,结果 = { 20, 25, 21, 30, 40 }
' 是否有交换过变量 = 真
' 第三遍排序
' 20!> 25,结果 = { 20, 25, 21, 30, 40 }
' 25 > 21,结果 = { 20, 21, 25, 30, 40 }
' 25!> 30,结果 = { 20, 21, 25, 30, 40 }
' 30!> 40,结果 = { 20, 21, 25, 30, 40 }
' 是否有交换过变量 = 真
' 第四遍排序
' 20!> 21,结果 = { 20, 21, 25, 30, 40 }
' 21!> 25,结果 = { 20, 21, 25, 30, 40 }
' 25!> 30,结果 = { 20, 21, 25, 30, 40 }
' 30!> 40,结果 = { 20, 21, 25, 30, 40 }
' 是否有交换过变量 = 假
' 到此可以看出,最后一次排序时
' 【当前值】没有一次比【下一值】大
' 也就是没有交换过变量,表示排序完成了
子程序名返回值类型公开备 注
冒泡排序_优化  
参数名类 型参考可空数组备 注
数组整数型
变量名类 型静态数组备 注
成员数整数型 
i整数型 
最后位置整数型 
成员数 = 取数组成员数 (数组)
判断循环首 (成员数 > 0)
最后位置 = 0
变量循环首 (1, 成员数 - 1, 1, i)
如果真 (数组 [i] > 数组 [i + 1])
交换变量 (数组 [i], 数组 [i + 1])
最后位置 = i

变量循环尾 ()
成员数 = 最后位置
判断循环尾 ()


i支持库列表   支持库注释   
spec特殊功能支持库

评分

参与人数 2好评 +1 精币 +4 收起 理由
hscd + 1 新技能已get√
Suky + 1 + 3 感谢分享,很给力!~

查看全部评分

回复

使用道具 举报

结帖率:95% (21/22)

签到天数: 27 天

发表于 2024-9-10 12:15:36 | 显示全部楼层   广东省广州市
直接百du冒泡排序就明白了,只是减少对比次数加快效率。
如果对 已经对比好的顺序数字再次对比也可以,只要不是百万次的重复影响不大
回复

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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