他山之石,可以攻玉--从伪代码的角度来理解排序算法
在学习各种排序算法的过程中,网上看到的参考资料大部分都是类似于“xxx语言中排序算法的实现”,然后直接给出某种编程语言中各种排序算法的代码实现。这类的参考资料,容易让初学者纠结于所用的编程语言的具体语法,而对排序算法的真正逻辑的理解过于单薄。
相比于通过学习某一门编程语言的排序算法的具体实现,使用伪代码来学习排序算法,则有以下优点:
- 不用纠结于语法的细节,因为语法是我们自己定的
- 可以体会语言设计者的想法,因为语法是我们自己定的
- 学习过程中,我们的精力专注于算法逻辑的梳理和流程图的实现
接下来,我们就可以制订一套属于自己的语法规则。在拟写自创的语法规则之前,我们需要了解一下结构化编程的概念,这对于拟写一套可用的语法规则十分重要。
什么是结构化编程
结构化编程
是一种编程典范。它采用子程序、程式码区块、for回圈以及while回圈等结构,来取代传统的goto。希望借此来改善计算机程序的明晰性、品质以及开发时间,并且避免写出面条式代码。
通过维基百科,我们可以提炼出结构化编程的几个要点:
- 代码一行一行有序执行
- 有条件控制语句 if...else...
- 有循环控制语句 while(exp) do...
编写自创的语法规则
了解了结构化编程的基本概念以后,我们就可以拟写自己的语法规则了。
a <- 1
表示将 1 拷贝给 a- 条件控制语句:
if xxx1
elseif yyy2
else3
end
复制代码
- 循环语句
n <- 0while n < 10print nn <- n+1end
复制代码
- length 表示一个容器, 'length' 表示字符串,
length <- 'length'
表示将字符串放入容器 - `//``表示注释的写法
从数组找最小数字
有了我们自己的语法规则以后,现在来练习一个小例子:假设有一个数组a,里面有n个数,现在需要从a中找出最小的数。
我们想想,我们是怎么在n个数里做大小比较的,按照计算机思维,应该两两数字做对比,选出小的,再将小的数字与后面的数字两两对比,这样一直循环比较,总共做n-1次比较,最小的数字便是最后一次两两对比中那个小的。
按照以上分析,我们组织一下伪代码的写法:
//将数组赋值给a
a <- {'0': 23'1': 43'2': 239'3': 1321'4': 90'length': 5
}
//将数组第一项赋值给min
min <- a['0']
index <- 1
//遍历数组,两两比较,取得较最小值
while index < a['length']if a[index] < minmin <- a[index]endindex <- index + 1
end
print min
复制代码
从数组找最小数字思考冒泡排序
既然我们能够从数组n个数字中找出最小的,那稍稍思考一下,我们完全可以用这个找最小数字的方法,来给数组的n个数字做排序,流程如下:
- 准备一个新数组
- 从数组n个数字中按照找最小数的方法,找出最小的数字min, 从数组中取出min放入新数组,此时原数组还剩下n-1个数
- 从原数组剩下的n-1个数,重复步骤2,直到原数组所有数字被取出
- 此时的新数组即为排序好的数组
虽然我们完成了数组排序,但是却多用了一个新数组,原数组的项数n不大时,这看起来无关紧要,但如果n非常大时,空间浪费这个问题就比较明显了,所以我们需要优化一下流程,做到在原数组内部就能够进行排序。优化后的流程如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
我们尝试画一下流程图:
根据流程图的逻辑,冒泡排序的伪代码如下:
//将数组赋值给a
a <- {'0': 23'1': 43'2': 239'3': 1321'4': 90'length': 5
}
//最开始轮数为1
count <- 1
while count < a['length']index <- 0 while index < a['length'] - countif a[index] > a[index+1]//将小的数靠前排tmp <- a[index]a[index] <- a[index+1]a[index+1] <- tmpendindex -< index + 1end//轮数加1count <- count + 1
end
复制代码
可以看到的是,有了流程图的辅助,即使是自创的语法规则,冒泡排序也能写的异常清晰。
有了伪代码以后,我们只要稍加改动,就能以真正的编程语言来实现冒泡排序,我们以JS为例:
function bubbleSort(array) {var i,j,tmp;var length = array.lengthfor(i=1;i<length;i++) {for(j=0;j<length -1 -i;j++) {if (array[j]>array[j+1]) {tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}return array
}
bubbleSort([4,3,9,8,4,7,5,2,10,35,14,86,1,2,4,3])
//[1, 2, 2, 3, 3, 4, 4, 4, 5, 7, 8, 9, 10, 14, 35, 86]
复制代码
以上就是通过伪代码来学习排序算法的全过程,如果对你有帮助的的话,可以点个喜欢。
他山之石,可以攻玉--从伪代码的角度来理解排序算法相关推荐
- 【算法实践】他山之石, 可以攻玉 -- 利用完全二叉树快速实现堆排序
前言 什么是堆 堆是一种数据结构,它是完全二叉树或者是近似完全二叉树的一种数据结构,树中每个结点的值都不小于(或不大于)其左右孩子结点的值. 何为完全二叉树 完全二叉树是一种特殊的二叉树,完全二叉树是 ...
- 一探B站后台架构, 他山之石, 何以攻玉? -- 仅从一个一线Golang开发者的角度谈B站4.22代码
4月22日, B站部分后台源代码因为某愤怒的员工, 被上传至Github. 本文我们不讨论安全, 法律, 去恶意攻击或者获利是违法的! 我们工作时也要注意代码安全), 我仅从开发者的角度谈谈, 这份代 ...
- 数据中心节能专题—他山之石可以攻玉
电机是耗电量最大的单种类设备.根据国际能源署最近的一项调查,电机耗电量占据工业领域耗电量的大约三分之二,如上所述,占大约 46% 的全球耗电量. 随着数字化生活的推进,数据中心已成为不疏于工业企业的用 ...
- 他山之石可以攻玉, 不可不读的阿里云原生中间件行业案例与实践集锦
简介:阿里云原生中间件行业案例与实践集锦 1.[在线教育行业]Timing App的Serverless实践案例 在用户.流量爆发式增长背景下,Timing App面临着四大挑战: 系统稳定性差.产品 ...
- 个人第一次作业——“他山之石,可以攻玉”
--------------------------- 这个作业属于哪个课程| <课程的链接> ---- | ---- 这个作业要求在哪里| <作业的要求> 我在这个课程的目标 ...
- 【IT职场生存手册】他山之石,可以攻玉【51CTO技术论坛】
http://bbs.51cto.com [IT职场生存手册]他山之石,可以攻玉 人生的每条路对于我们都是新的,因为不能重新来过.所以会有很多困惑.疑虑,就想混在IT职场的人们,常常看 ...
- 他山之石、可以攻玉 - 我的2015年总结
他山之石.可以攻玉- 我的2015年总结 本来打算年前写个总结的,没办法最近事情比较多,拖到年后了,2015年自己经历事情 真的是挺多的,无论在工作还是生活还是工作,个人发展方面都有一些新的变换. 关 ...
- 他山之石,可以攻玉, 改造fasthttp实现高性能网络通信
前言 如果朋友看过在下上一篇文章<boot4go-gateway和nginx的性能测试大PK>,能在反向代理的性能PK中完胜Nginx的Gateway,是使用GO语言在基于比Go的标准ht ...
- 它山之石可以攻玉,AP计算机AP微积分同时取得满分------肺腑经验,以资借鉴!
一开始我是在学校学了A level计算机,但老师没讲清楚就经常一脸懵.后来上了林振营老师的AP 计算机课程,林老师讲课由浅入深,条理清晰,令我茅塞顿开,用几节课就让我明白了学校老师讲了一个月也没讲明白 ...
最新文章
- tensorflow官方文档_开源分享:最好的TensorFlow入门教程
- oracle数据库分组查询group by
- windows 下终止指定端口的进程
- 压缩命令tar cf xx.tar -C的正确用法
- 监控工具—Prometheus—监控Redis
- 向左滚动,每次滚动的长度可以设置,然后暂停后继续滚动
- 链表题目--1 删除链表中所有等于val的值
- ad中电容用什么封装_图文并茂用最通俗易懂的对话为你讲解电子技术知识- C什么是电容?...
- 修改卡巴斯基注册表,无限试用
- UA OPTI512R 傅立叶光学导论13 傅立叶变换及其性质
- PHP判断手机号码是否正确
- Excel VBA初级系列培训--课时2
- Android挂逼修练之行--微信聊天消息修改器插件开发详解
- 活动倒计时的一些想法
- ubuntu安装软件包命令
- matlab epics,基于EPICS/MATLAB图像处理的光束位置测量系统
- 机器人擂台的利剑_格斗机器人史上攻击力大排行,排名第一的果然是TA!
- 迎接新时代,维谛技术全面呈献硬核策略
- Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现直播功能
- SqlServer中with(nolock)详解
热门文章
- 2017交大计算机专业分数线,2017上海交大录取分数线历年录取分(2)
- editor修改样式 vue_vue修改富文本中的元素样式
- flowable 查询完成的流程_中注协正在调试注册会计师成绩查询系统?
- php output详解,【PHP】Output Control 扩展详细解读
- 求矩阵不靠边元素之和_机器(深度)学习数学知识之范数
- 有计算机考试励志的文案,关于考试的句子励志
- linux系统电脑接硬盘盒,在linux系统下添加新硬盘
- 网易云api如何调用_谈谈网易云如何快速升级
- spring boot 教程(四) 统一异常处理
- mysql去掉乱码_mysql消除乱码方法集