1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 他山之石 可以攻玉--从伪代码的角度来理解排序算法

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

时间:2019-03-06 22:06:41

相关推荐

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

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

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

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

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

什么是结构化编程

结构化编程

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

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

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

编写自创的语法规则

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

a <- 1表示将 1 拷贝给 a条件控制语句:

if xxx1elseif yyy2else3end复制代码

循环语句

n <- 0while n < 10print nn <- n+1end复制代码

length 表示一个容器, 'length' 表示字符串,length <- 'length'表示将字符串放入容器`//``表示注释的写法

从数组找最小数字

有了我们自己的语法规则以后,现在来练习一个小例子:假设有一个数组a,里面有n个数,现在需要从a中找出最小的数。

我们想想,我们是怎么在n个数里做大小比较的,按照计算机思维,应该两两数字做对比,选出小的,再将小的数字与后面的数字两两对比,这样一直循环比较,总共做n-1次比较,最小的数字便是最后一次两两对比中那个小的。

按照以上分析,我们组织一下伪代码的写法:

//将数组赋值给aa <- {'0': 23'1': 43'2': 239'3': 1321'4': 90'length': 5}//将数组第一项赋值给minmin <- a['0']index <- 1//遍历数组,两两比较,取得较最小值while index < a['length']if a[index] < minmin <- a[index]endindex <- index + 1endprint min复制代码

从数组找最小数字思考冒泡排序

既然我们能够从数组n个数字中找出最小的,那稍稍思考一下,我们完全可以用这个找最小数字的方法,来给数组的n个数字做排序,流程如下:

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

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

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

我们尝试画一下流程图:

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

//将数组赋值给aa <- {'0': 23'1': 43'2': 239'3': 1321'4': 90'length': 5}//最开始轮数为1count <- 1while 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 + 1end复制代码

可以看到的是,有了流程图的辅助,即使是自创的语法规则,冒泡排序也能写的异常清晰。

有了伪代码以后,我们只要稍加改动,就能以真正的编程语言来实现冒泡排序,我们以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]复制代码

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。