算法图解第二章--选择排序法(数组,链表的进一步理解)(学习笔记)


如果想更好的理解本文章,你可以看往期文章。
一、算法图解第一章(二分查找法,运行时间,大O表示法)

一、数组

1、首先,应该都了解数组吧,它申请的内存都是连续在一起的。

2、为了更好的理解,我们以例子来讲解。假如你和朋友们去电影院看电影,你们一共有3个人,此时计算机为你们分配了连续的3个位置,但此时又来了一位朋友,但你们现在坐的位置已经没有了位置(就是没办法坐在一起了),如图
在这里插入图片描述

此时如果你是数组,你该怎么办呢?你就会请求计算机重新分配能容纳4个人的连续的内存,找到后你们四个人便移动到新位置,那如果又来一个人呢?你就会重新让计算机再找位置,再一起移动到新位置,是不是如此的麻烦。而面对此情况一种解决方法是“预留座位”,也就是即便你只有三个人,我也要让计算机给我找能容纳10个人的位置,这样只要不超过10个人就可以。
但它有如下两个缺点:

1、你额外请求的位置可能根本用不上,这将浪费内存,别人也用不了。

2、你需求的内存超过10个后,你还得转移。

因此,解决此类问题,我们可以用链表来解决。

二、链表

1、链表中的元素可储存在内存的任何地方

2、如果你不了解链表,你可以先知道链表里有2部分,数据域和指针域。

3、在这里我们主要是了解指针域,指针域是存放下一个元素的地址,从而使一系列元素串在一起。

补充:
你可以这样理解,犹如寻宝游戏,你前往第一个地址,那里有一张纸条,上面写着“下一个元素的地址”,你再到第二个元素那里,那里又有下一个元素的地址,以此类推。如果你要在末尾添加元素,你只需要把上一个元素的指针域存储新添元素的地址即可

三、数组与链表的优缺点

那我们什么时候用链表呢?什么时候用数组呢?相信上面的分析你已经心中有一些想法。

如果你要在数据中间插入元素,应该选择链表,你只需要将新元素的指针域指向它前面元素的指针域指向的那个地址,然后将它前面的那个元素的指针域指向新元素即可。

那为什么不用数组呢?因为如果要在数组中间插入元素,则必须将它后面的元素都向后移动,如果没有足够的空间,可能还得将这个数组复制到其他地方。所以,当需要在中间插入元素时,链表是更好的的选择。

如果要删除元素呢?链表也是更好的选择,因为只需要修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。

四、顺序访问和随机访问

数组没有优势吗?这里将体现数组的优势。

顺序访问意味着从第一个元素开始逐个地读取元素,链表只能顺序访问,这意味着,你如果要读取第十个元素,你必须先读取前9个元素,并沿链接找到第十个元素。

随机访问意味着可直接跳到第十个元素,数组则支持随机访问,所以需要随机地读取元素时,数组的效率很高。而且很多情况要求能够随机访问,所以数组用的很多。

五、选择排序

选择排序就是不断地从未排序的元素中选择最大(或者最小)的元素放入已经排好序的元素中,直到未排序中仅剩下一个元素为止。用一个实例进行理解:
对一个列表进行排序:
基本思想就是假设第一个位置上的为最大,然后依次去和下面的进行比较,如果发现比第一个位置数大的,那就记下来它的编号J(因为不确定后面有没有比它大的数了,应当循环完,找出最大数的编号,再进行交换,这样只需要交换一次)。

List=[15,16,17,66,55,11,88]
for i in range(0,6):    #k+1应该小于7,所以这里的k又等于i,所以小于6
    k=i
    for j in range(k+1,7):
        if List[k]<List[j]:
            k=j
    if k!=i:
        team=List[k]
        List[k]=List[i]
        List[i]=team
print(List)

结果:

[88, 66, 55, 17, 16, 15, 11]

六、运行时间

上面的选择排序,若有n个元素,这里需要的运行时间为O(n2n^2),你如果理解了选择排序或看懂了代码,你会有疑问。
随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一
个。既然如此,运行时间怎么还是O(n2n^2)呢?

这与大O表示法中的常数相关。理解的不错,并非每次都需要检查n个元素。第一次需要检查n个元素,但随后检查的元素数依次为n - 1, n – 2, …, 2和1。平均每次检查的元素数为1/2 ×( n+1),共有n次,因此运行时间为O(n × 1/2 × (n+1))。
但大O表示法省略诸如1/2这样的常数(有关这方面的完整讨论,后面的篇幅会有详解,这里就简单说一下),因此简单地写作O(n × n)或O(n2n^2)。

结语:

算法图解这本书正在学习,如果有志同道合的朋友可以一起学习。如果哪里有不足,可以留言指正。
这本书的电子版可以去我主页简介里有获取方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章