一、排序算法
基于比较的低效算法:
选择排序、插入排序、冒泡排序。时间复杂度O(n2)。
基于比较的高效算法:
归并排序、快速排序、堆排序。时间复杂度O(nlogn)。
基于数值划分的高效算法:
计数排序、基数排序、桶排序。时间复杂度O(n)。
二、sort()函数和sorted()函数
1.sort()和sorted()的区别
sort()是应用在list上的方法;在原列表上排序。
sorted()可以对所有可迭代的对象进行排序操作;产生一个新的列表,不改变原列表。
实例对比如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8455f402ec4641d97a234a370fd93c52.png)
![](https://i-blog.csdnimg.cn/blog_migrate/288ba9f5e5c94863a972ef70dc33f12b.png)
2.细说sorted()函数
![](https://i-blog.csdnimg.cn/blog_migrate/56fdc3194c9779245b1f2bbf1bfc29a8.png)
语法:
sorted(iterable,key=None,reverse=False)
参数说明:
iterable:可迭代对象。
key:用来进行比较的元素,只有一个参数,具体的函数的参数取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse:排序规则,reverse = True 降序,reverse = False 升序(默认)
返回值:重新排序的列表。
实例:
![](https://i-blog.csdnimg.cn/blog_migrate/ada45d0f1b5e1e4c8c9f97dd2279143d.png)
3.部分排序
sort()不能在一部分上做排序,只能整体排序。
sorted()可以部分排序,但是不能在原数据上排序。
![](https://i-blog.csdnimg.cn/blog_migrate/23b2cda7b2a587fc2c476574cebb8e07.png)
4.函数的应用实例1
![](https://i-blog.csdnimg.cn/blog_migrate/584578d071815d30de9d60f4c3a6a8ff.png)
![](https://i-blog.csdnimg.cn/blog_migrate/16a5dd1c1b950dee80560f2d5ce39f1f.png)
补充join函数
语法:
'sep'.join(sep_object)
参数说明:
sep:分割符,可为“ ,、;”等。
sep_object:分割对象,可为字符串、以及储存字符串的元组、列表、字典。
作用:
连接任意数量的字符串(包括要连接的元素字符串、元组、列表、字典),用新的目标分隔符连接,返回新的字符串。
6.函数的应用实例2
![](https://i-blog.csdnimg.cn/blog_migrate/b2fdbc8236faf7d58a41fec04569c357.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e87b78d94c790db121bb5353e5172a52.png)
(1)超时做法
![](https://i-blog.csdnimg.cn/blog_migrate/fe94c1b246c8c3f69ea51f4c777b6825.png)
(2)巧妙做法
![](https://i-blog.csdnimg.cn/blog_migrate/dfdf307fbae7e890da8c8adbf568adf9.png)
7.函数的应用实例3
![](https://i-blog.csdnimg.cn/blog_migrate/157474e300ccb80f2f26cf0c2c28870a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80558b4e77c6d9329cf617633292e853.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8e09f1a2630744704750d30144d4067c.png)
二、结构体排序
sort()和sorted()都能对结构体排序
1.简介写法
s.sort(key=lambda x:x[i],reverse=True)
a=sorted(s,key=lambda x:x[i],reverse=True)
2.自己写比较函数
def cmp():
s.sort(key=functools.cmp_to_key(cmp))
a=sorted(s,key=functools.cmp_to_key(cmp))
3.经典例题1
![](https://i-blog.csdnimg.cn/blog_migrate/4ac9b2b76d74a226a4fded3e12a72255.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4dc07265945185fef590224ea42a2b78.png)
(1)简洁写法
![](https://i-blog.csdnimg.cn/blog_migrate/f72b8289d7388538d312a31af79bdd69.png)
(2)自写比较函数cmp()
![](https://i-blog.csdnimg.cn/blog_migrate/ff00dbb1f5812d56514b3f5e6fe11584.png)
三、部分排序
Python的sort()或 sorted(),没有C++的sort()灵活
sort()不能在数组的一部分上做排序,只能对整个数组排序。只能先拷贝出要排序的部分,排序后再拷贝回去。
sorted()虽可以对一部分排序,但是不能直接在原数组上排序。同样也需要拷贝。
1.经典例题1
![](https://i-blog.csdnimg.cn/blog_migrate/d3e2ac34a89b69a7dd5de8cbb4ac3cf5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2609292ba8a1d5743bd154c67001ba7a.png)
(1)sort()代码
![](https://i-blog.csdnimg.cn/blog_migrate/56cfff0010ad8a1d04eda1cf9c45ac07.png)
(2)sorted()代码
![](https://i-blog.csdnimg.cn/blog_migrate/83279ef2c4f67221b1eb6fde7a88a987.png)
2.经典例题2
![](https://i-blog.csdnimg.cn/blog_migrate/1ee401ad6bb3dae262cc10736013c578.png)
(1)硬算+排序
由于Python编码简洁,即使硬算出所有3、5、7的倍数,然后再排序找到59084709587505的位置,也容易编码。
![](https://i-blog.csdnimg.cn/blog_migrate/835a6d47643f812162d5283499b69160.png)
(2)暴力搜
这个系列的数可以表示为3ix5jx7,搜索所有不超过范围的i、i、k组合即可。
Python不用担心大数,循环时顺便取个很大的范围作为终止条件,代码中最小的350肯定超过59084709587505。
![](https://i-blog.csdnimg.cn/blog_migrate/984df8cce9d7c8aa639f85a7e3cc4d13.png)