各种排序算法以及它们的时间复杂度分析是很多企业面试人员在面试时候经常会问到的问题,这也不难理解,在实际的应用过程中确实会遇到各种需要排序的情况,
如按照字母表输出一个序列、对记录的多个字段排序等。还好,Python中的排序相对简单,常用的函数有 sort()和sorted()两种。这两种函数并不完全相同,各有各的用武之地。我们来具体分析一下。
1.相比于sort(),sorted()使用的范围更为广泛,两者的函数形式分别如下:
sorted(iterable[, cmp[, key[, reverse]]])
s.sort([cmp[, key[, reverse]]])
这两个方法有以下3个共同的参数:
(1)cmp为用户定义的任何比较函数
函数的参数为两个可比较的元素(来自iterable或 者list),函数根据第一个参数与第二个参数的关系依次返回-1、0或者+1 (第一个参数小于第二个参数则返回负数)。该参数默认值为None。
(2)key是带一个参数的函数
用来为每个元素提取比较值,默认为None(即直接比较每个元素)。
(3)reverse表示排序结果是否反转。
因此下面的例子中针对元组使用sort。方法会抛出AttributeError,而使用sorted。函数则没有这个问题
sorted()函数是在Python2.4版本中引入的,在这之前只有sort。函数。sorted()函数会返回一个排序后的列表,原有列表保持不变;而sort。函数会直接修改原有列表,函数返回为None。来看下面的例子:
3.无论是sort()还是sorted()函数,传入参数key比传入参数cmp效率要高。
cmp传入的函数在整个排序过程中会调用多次,函数开销较大;而key针对每个元素仅作一次处理,因此使用key比使用cmp效率要高。下面的测试例子显示使用key比cmp约快50%。
来看下列例子。
(1)对字典进行排序:
下面的例子中根据字典的值进行排序,即将phonebook对应的电话 号码按照数字大小进行排序。
实际情况下也会碰到需要对多个字段进行排序的情况,如根据学生的成绩、对应的等级依次排序。当然这在DB里面用SQL语句很容易做到,但使用多维列表联合sortedQ函数也可以轻易达到类似的效果。
如果字典中的key或者值为列表,需要对列表中的某一个位置 的元素排序也是可以做到的。下面的例子中针对字典mydict的value结构[n.m]中的n按照从小到大的顺序排列。
如果列表中的每一个元素为字典形式,需要针对字典的多个key值进行排序也不难实现。
下面的例子是针对list中的字典元素按照rating和name 进行排序的实现方法。