在学习各种排序算法的过程中,网上看到的参考资料大部分都是类似于“xxx语言中排序算法的实现”,然后直接给出某种编程语言中各种排序算法的代码实现。这类的参考资料,容易让初学者纠结于所用的编程语言的具体语法,而对排序算法的真正逻辑的理解过于单薄。

相比于通过学习某一门编程语言的排序算法的具体实现,使用伪代码来学习排序算法,则有以下优点:

  1. 不用纠结于语法的细节,因为语法是我们自己定的
  2. 可以体会语言设计者的想法,因为语法是我们自己定的
  3. 学习过程中,我们的精力专注于算法逻辑的梳理和流程图的实现

接下来,我们就可以制订一套属于自己的语法规则。在拟写自创的语法规则之前,我们需要了解一下结构化编程的概念,这对于拟写一套可用的语法规则十分重要。

什么是结构化编程

结构化编程

是一种编程典范。它采用子程序、程式码区块、for回圈以及while回圈等结构,来取代传统的goto。希望借此来改善计算机程序的明晰性、品质以及开发时间,并且避免写出面条式代码。

通过维基百科,我们可以提炼出结构化编程的几个要点:

  1. 代码一行一行有序执行
  2. 有条件控制语句 if...else...
  3. 有循环控制语句 while(exp) do...

编写自创的语法规则

了解了结构化编程的基本概念以后,我们就可以拟写自己的语法规则了。

  1. a <- 1 表示将 1 拷贝给 a
  2. 条件控制语句:
if xxx1
elseif yyy2
else3
end
复制代码
  1. 循环语句
 n <- 0while n < 10print nn <- n+1end
复制代码
  1. length 表示一个容器, 'length' 表示字符串, length <- 'length' 表示将字符串放入容器
  2. `//``表示注释的写法

从数组找最小数字

有了我们自己的语法规则以后,现在来练习一个小例子:假设有一个数组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个数字做排序,流程如下:

  1. 准备一个新数组
  2. 从数组n个数字中按照找最小数的方法,找出最小的数字min, 从数组中取出min放入新数组,此时原数组还剩下n-1个数
  3. 从原数组剩下的n-1个数,重复步骤2,直到原数组所有数字被取出
  4. 此时的新数组即为排序好的数组

虽然我们完成了数组排序,但是却多用了一个新数组,原数组的项数n不大时,这看起来无关紧要,但如果n非常大时,空间浪费这个问题就比较明显了,所以我们需要优化一下流程,做到在原数组内部就能够进行排序。优化后的流程如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

我们尝试画一下流程图:

根据流程图的逻辑,冒泡排序的伪代码如下:

//将数组赋值给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]
复制代码

以上就是通过伪代码来学习排序算法的全过程,如果对你有帮助的的话,可以点个喜欢。

他山之石,可以攻玉--从伪代码的角度来理解排序算法相关推荐

  1. 【算法实践】他山之石, 可以攻玉 -- 利用完全二叉树快速实现堆排序

    前言 什么是堆 堆是一种数据结构,它是完全二叉树或者是近似完全二叉树的一种数据结构,树中每个结点的值都不小于(或不大于)其左右孩子结点的值. 何为完全二叉树 完全二叉树是一种特殊的二叉树,完全二叉树是 ...

  2. 一探B站后台架构, 他山之石, 何以攻玉? -- 仅从一个一线Golang开发者的角度谈B站4.22代码

    4月22日, B站部分后台源代码因为某愤怒的员工, 被上传至Github. 本文我们不讨论安全, 法律, 去恶意攻击或者获利是违法的! 我们工作时也要注意代码安全), 我仅从开发者的角度谈谈, 这份代 ...

  3. 数据中心节能专题—他山之石可以攻玉

    电机是耗电量最大的单种类设备.根据国际能源署最近的一项调查,电机耗电量占据工业领域耗电量的大约三分之二,如上所述,占大约 46% 的全球耗电量. 随着数字化生活的推进,数据中心已成为不疏于工业企业的用 ...

  4. 他山之石可以攻玉, 不可不读的阿里云原生中间件行业案例与实践集锦

    简介:阿里云原生中间件行业案例与实践集锦 1.[在线教育行业]Timing App的Serverless实践案例 在用户.流量爆发式增长背景下,Timing App面临着四大挑战: 系统稳定性差.产品 ...

  5. 个人第一次作业——“他山之石,可以攻玉”

    --------------------------- 这个作业属于哪个课程| <课程的链接> ---- | ---- 这个作业要求在哪里| <作业的要求> 我在这个课程的目标 ...

  6. 【IT职场生存手册】他山之石,可以攻玉【51CTO技术论坛】

    http://bbs.51cto.com [IT职场生存手册]他山之石,可以攻玉         人生的每条路对于我们都是新的,因为不能重新来过.所以会有很多困惑.疑虑,就想混在IT职场的人们,常常看 ...

  7. 他山之石、可以攻玉 - 我的2015年总结

    他山之石.可以攻玉- 我的2015年总结 本来打算年前写个总结的,没办法最近事情比较多,拖到年后了,2015年自己经历事情 真的是挺多的,无论在工作还是生活还是工作,个人发展方面都有一些新的变换. 关 ...

  8. 他山之石,可以攻玉, 改造fasthttp实现高性能网络通信

    前言 如果朋友看过在下上一篇文章<boot4go-gateway和nginx的性能测试大PK>,能在反向代理的性能PK中完胜Nginx的Gateway,是使用GO语言在基于比Go的标准ht ...

  9. 它山之石可以攻玉,AP计算机AP微积分同时取得满分------肺腑经验,以资借鉴!

    一开始我是在学校学了A level计算机,但老师没讲清楚就经常一脸懵.后来上了林振营老师的AP 计算机课程,林老师讲课由浅入深,条理清晰,令我茅塞顿开,用几节课就让我明白了学校老师讲了一个月也没讲明白 ...

最新文章

  1. tensorflow官方文档_开源分享:最好的TensorFlow入门教程
  2. oracle数据库分组查询group by
  3. windows 下终止指定端口的进程
  4. 压缩命令tar cf xx.tar -C的正确用法
  5. 监控工具—Prometheus—监控Redis
  6. 向左滚动,每次滚动的长度可以设置,然后暂停后继续滚动
  7. 链表题目--1 删除链表中所有等于val的值
  8. ad中电容用什么封装_图文并茂用最通俗易懂的对话为你讲解电子技术知识- C什么是电容?...
  9. 修改卡巴斯基注册表,无限试用
  10. UA OPTI512R 傅立叶光学导论13 傅立叶变换及其性质
  11. PHP判断手机号码是否正确
  12. Excel VBA初级系列培训--课时2
  13. Android挂逼修练之行--微信聊天消息修改器插件开发详解
  14. 活动倒计时的一些想法
  15. ubuntu安装软件包命令
  16. matlab epics,基于EPICS/MATLAB图像处理的光束位置测量系统
  17. 机器人擂台的利剑_格斗机器人史上攻击力大排行,排名第一的果然是TA!
  18. 迎接新时代,维谛技术全面呈献硬核策略
  19. Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现直播功能
  20. SqlServer中with(nolock)详解

热门文章

  1. 2017交大计算机专业分数线,2017上海交大录取分数线历年录取分(2)
  2. editor修改样式 vue_vue修改富文本中的元素样式
  3. flowable 查询完成的流程_中注协正在调试注册会计师成绩查询系统?
  4. php output详解,【PHP】Output Control 扩展详细解读
  5. 求矩阵不靠边元素之和_机器(深度)学习数学知识之范数
  6. 有计算机考试励志的文案,关于考试的句子励志
  7. linux系统电脑接硬盘盒,在linux系统下添加新硬盘
  8. 网易云api如何调用_谈谈网易云如何快速升级
  9. spring boot 教程(四) 统一异常处理
  10. mysql去掉乱码_mysql消除乱码方法集