数据结构与算法(2)——选择排序

假设一下这个场景:你要去参加一场会议,需要把身上的物品放到会议室外的柜子里。柜子里有很多小抽屉,每个抽屉只能放一件东西。

现在,你身上有三件东西,此时你有两个选择:把三件东西放在相邻的抽屉里,或者放在不相邻的抽屉里。

这就像是计算机的内存一样,每个小抽屉就是一个内存单元的地址。而上述的两种存放方式在计算机中则表现为两种存储方式:数组和列表。

乍一看,肯定是数组更要方便些。因为放在一起,方便查找。但是,这个时候,如果你的朋友一起来了,他要和你放在一块,但是你的抽屉旁边都满了。

这个时候为了放在一起,你们不得不重新找出另一个四个连着的空的抽屉。

你会这样想:为什么我不预留两个呢?

确实,这样的话当物品不超过五个,就无须转移。但是要是超过五个,还是得转移。而且如果用不到五个,则会造成资源浪费。

这在计算机内存中同理。

所以,对于这种问题,我们可以用链表来解决。

链表不像数组那么苛刻,必须全部抽屉连在一起。你可以这么想,在每放进一个物品后,你在前一个抽屉里放一个记录了这个抽屉位置的小纸条,这样你只要记住第一个抽屉的位置就好了。

这样做的好处显而易见,你不用再找一整块地方放东西,放的零零散散也无所谓,只要你的纸条正确了,那么就丢不了。可是要是你想找某个特定的物品呢?

不好意思,这样你也得从第一个开始找。

显然,链表虽然使存放变得容易,但是查找起来却困难了。

这个时候,数组的优势就显现了出来。假设你存放了五个元素,第一个元素的地址是00,那么最后一个元素的地址就是04。所以,当要随机读取数据时,数组的效率反而更高。

如果用大O表示法来表示数组和链表的差别,那么数组的读取速度是O(1),插入速度是O(n)(假使插入第一个,那么后面所有的数据都要往后挪一位,如果空间不够,甚至还会全部挪到另一个地方),而链表刚好相反,在插入时,链表只需要改动一下这个元素前面那个抽屉的地址就行了。读取速度是O(n),插入速度是O(1)。

但是和插入不同,删除似乎总是能成功的(对于数组来说,插入如果找不到一整块合适的内存就可能会插入失败)。删除操作和插入操作的速度是相同的。

你一定想知道是哪个数据存放方式用到的更多。实际上,虽然链表更灵活,但是为了查找方便,更多使用的是数组。数组的访问速度快是因为它支持随机访问,而链表只支持顺序访问。

之后还会用链表和数组组成其他存储方式。

有了这些基础知识,接下来介绍重点——选择排序。

现在给你有100个不重复的数字的列表,你需要做的就是把它们从小到大进行排列。

其中一种方法就是遍历这个列表,先找出最小的数字,把这个最小的数字放到另一个列表里。

重复这么做,找出第二小的数字放入列表里。循环往复,这样你就可以得到一个从小到大排列的有序列表。

现在我们观察这个过程需要多长时间。我们发现,在比较的过程中,每把一个数字放入另一个列表里,意味着每个数字都查看了一遍。这个过程需要的时间是O(n)。

我们要把所有的数字都放进另一个列表里,假设每个数字放进去时,都需要检查全部数字,那么总时间就是O(n * n)。

但实际上,随着排序的进行,我们要检查的数字在逐渐减少。第一次确实要检查n个元素,但随后检查的元素分别是n-1,n-2,……2,1。平均每次检查次数为0.5n,所以运行时间应该是O(0.5 x n x n),但是大O表示法省略了0.5这类的表示,所以一般写为O(n x n)(也可以写为平方)。

小结一下:
1.计算机内存犹如一大堆抽屉。

2.需要存储多个元素时,可使用链表或者数组。

3.数组的元素都放在一起。

4.链表的元素是分开的,其中每个元素都存放了下个元素的地址。

5.数组的读取速度很快。

6.链表的插入和删除速度很快。

7.在同一个数组里,所有元素的类型都必须相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值