python中sort()和sorted()研究

def sorted(*args, **kwargs): # real signature unknown
    """
    Return a new list containing all items from the iterable in ascending order.
    
    A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order.
    """
    pass

sort()函数和sorted()函数的区别:

  1. sort()函数只应用在list上,需要先把其他对象转化成list, 然后用list.sort()方法;
    sorted()函数可以对任何可迭代的对象进行排序,包括list, str, dict等等,默认按照升序排列;
  2. sort()函数在原有的list上直接修改,sorted()函数不改变原有的对象,返回一个新的排好序的对象

sorted()使用语法:

sorted(iterable, key=None, reverse=False)
# iterable: 可迭代的对象
# key: 用来进行比较的元素,指定可迭代对象中的一个元素来进行排序
# reverse: 默认为False,升序;reverse=True为降序排列

sort()和sorted()使用区别:

a = [8, 4, 9, 1, 5]
a.sort()
# a = [1, 4, 5, 8, 9]

b = [8, 4, 9, 1, 5]
c = sorted(b)
# c = [1, 4, 5, 8, 9]
# b = [8, 4, 9, 1, 5] 不变

sort()和sorted()函数的底层实现及复杂度?
底层实现:Timsort
最坏时间复杂度:O(nlogn)
空间复杂度: O(n)

Timsort是什么?
Timsort是一种混合、稳定高效的排序算法,结合了插入排序和归并排序。

Timsort的思想
在现实中,需要排序的一大段数据里,大部分是已经排好序的一些数据块。Timsort利用这一特点,将这些小的数据块称为一个一个的run, 也称为“分区”,在排序时,Timsort迭代数据元素,将数据插入到不同的分区中,同时将这些分区进行合并,直到分区合并到最后只剩下一个时,这个最后的run即为排序好的结果。
简单来说,就是用插入排序扩充小的分区,然后合并分区 得到最终的排列结果。
补充:Timsort()用的是二分插入排序,先用二分查找找到需要插入的位置,然后再插入。(python中比较的成本大于移动的成本,因此尽量减少比较为好)

你可能感兴趣的:(python,算法基础)