前言
假设我们有一个没有任何排列顺序的电话号码表(或号码簿)。当需要添加联络人和电话时, 你只能将其写在下一个空位上。
假定你的联系人列表上有很多人,某天,你要找某个联系人及其 电话号码。但是由于联系人列表没有按照任何顺序来组织,你只能逐个检查,直到找到那个你想要的联系人为止。
这个方法太吓人了,难道你不这么认为?想象一下你要在黄页上搜寻一个联系人,但是那本黄页没有进行任何组织,那得花多久时间啊?!
因此(还有其他原因),我们需要组织信息集,比如那些存储在数据结构里的信息。排序和搜索算法广泛地运用在待解决的日常问题中。
一. 排序算法
从上面的引言中,你应该理解,对给定信息得先排序再搜索。本节会介绍一些在计算机科学 中最著名的排序算法。我们会从最慢的一个开始,接着是一些性能较好的算法。
在开始排序算法之前,我们先创建一个数组(列表)来表示待排序和搜索的数据结构。
如你所见,ArrayList是一个简单的数据结构,它将项存储在数组中(行{1})。我们只需 要一个插入方法来向数据结构中添加元素(行{2}),用JavaScript Array类原生的 push方法即可。
最后,为了帮助我们验证结果,toString方法使用JavaScript原生Array类的join 方法,来拼接数组中的所有元素至一个单一的字符串,这样我们就可以轻松地在浏览器的控制台输出结果了。
join方法拼接数组元素至一个字符串,并返回该字符串。
注意ArrayList类并没有任何方法来移除数据或插入数据到特定位置。
我们刻意保持简单是 为了能够专注于排序和搜索算法。所有的排序和搜索算法会添加至这个类中。
二. 冒泡排序
人们开始学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而, 从运行时间的角度来看,冒泡排序是最差的一个,接下来你会知晓原因。
冒泡排序比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素项向上移动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。
让我们来实现一下冒泡排序:
首先,声明一个名为length的变量,用来存储数组的长度(行{1})。这一步可选,它能帮助我们在行{2}和行{3}时直接使用数组的长度。
接着,外循环(行{2})会从数组的第一位迭代 至最后一位,它控制了在数组中经过多少轮排序(应该是数组中每项都经过一轮,轮数和数组长 度一致)。
然后,内循环将从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比 较(行{4})。
如果这两项顺序不对(当前项比下一项大),则交换它们(行{5}),意思是位置为 j+1的值将会被换置到位置j处,反之亦然。
现在我们得声明swap函数(一个私有函数,只能用在ArrayList类的内部代码中):
交换时,我们用一个中间值来存储某一交换项的值。其他排序法也会用到这个方法,因此我 们声明一个方法放置这段交换代码以便重用。
(未完待续)
如果喜欢我,可以关注下面的公众号,了解更多干货的同时,还可以和上千的技术大咖一起交流讨论~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。