选择排序
在进行排序之前我们有必要知道两种基本的存储多项数据的方式—数组和链表。以下是二者的优缺点:
数 组
优 点:
可以知道每个元素的地址,方便对元素进行修改,随机存取元素的效率高。总而言之,它擅长随机访问。
缺 点:
- 额外请求的内存可能用不上,别人也用不了,这将大大浪费内存。
- 如果需要的内存超过申请的内存,在这里可以理解成数组的长度,需要进行数据的转移。显然,这是很麻烦的。
链 表
优 点:
主要优点在于插入,删除元素方面,不需要移动元素,只需要将其放入内存,并将其地址存储到前一个元素中。
缺 点:
读取数据的时候需要从第一个元素开始,根据里面存储的地址,顺式找下一个元素在内存中的位置
下面列出了常见数组和链表操作的运行时间:
选择排序
假设你的计算机存储了很多乐曲。对于每个乐队,你都记录了其作品被播放的次数。
你要将这个列表按播放次数从多到少的顺序排列,从而将你喜欢的乐队排序。该如何做呢?
- 一种办法是遍历这个列表,找出作品播放次数最多的乐队,并将该乐队添加到一个新列表中。
依次找出第二大,直到重新从大到小排好。如下图所示:
要找出播放次数最多的乐队,必须检查列表中的每个元素。正如你刚才看到的,这需要的时间为O(n)。因此对于这种时间为O(n)的操作,你需要执行n次。
需要的总时间为 O(n × n),即O(n2)。
**随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一个。既然如此,运行时间怎么还是O(n2)呢?**这个问题问得好,这与大O表示法中的常数相关。
你说得没错,并非每次都需要检查n个元素。第一次需要检查n个元素,但随后检查的元素数依次为n-1, n-2, …, 2和1。平均每次检查的元素数为1/2 × n,因此运行时间为O(n × 1/2 × n)。
但大O表示法省略诸如1/2这样的常数(有关这方面的完整讨论,请参阅第4章),因此简单地写作O(n × n)或O(n2)
选择排序是一种灵巧的算法,但其速度不是很快。
示例如下:
结果如下:、
大家可以参考此链接:https://blog.csdn.net/ysjian_pingcx/article/details/8656048