Sort - Sorted - 快排 (python)

目录

1. Sort 

2.Sorted

3.快速排序

3.1 为什么学快排?

3.2 快排的基本实现思路(代码实例是从小到大)


1. Sort 

        1.1 sort函数是列表 list 的内置函数 list专用!!!! 

        1.2 sort函数的语法和调用方式:list.sort(key,reverse)

        1.3 函数sort()会修改序列,但是不返回任何值

x=[8,9,0,7,4,5,1,2,3,6]
y=x.sort()
print(y)    # None
print(x)    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

        1.4 如果不想排序修改原序列 而且还要有返回值的话可以用sorted函数

        

        1.5 sort() 搭配参数使用

              (1) key参数

                        key接受的是一个只有一个形参的函数

                        key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序

x=[8,9,0,7,4,5,1,2,3,6]
def size(a):
    x=10-int(a)
    return x
x.sort(key=size)
print(x)

               (2)reverse参数

                         reverse=True :降序 

                         reverse=False : 升序

x=[8,9,0,7,4,5,1,2,3,6]
x.sort(reverse=True)
print(x)  # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

x.sort(reverse=False)
print(x)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2.Sorted

        2.1 sorted()函数可以对所有可迭代的对象进行排序操作

        2.2 sorted()函数是一个内置函数,可以直接使用

        

        2.3 sorted()函数语法:sorted(iterable, cmp=None, key=None, reverse=False)

                cmp :可选参数, 如果指定了该参数会使用该参数的方法进行排序。


                key : 主要是用来进行比较的元素,只有一个参数,具体的函数的

                          参数就是取自于可迭代对象中,指定可迭代对象中的一个元

                          素来进行排序。


                reverse :排序规则,reverse = True 降序, reverse = False 升序(默认)


                iterable:迭代对象

        2.4 sorted()函数不会影响迭代对象本身,会有返回值(和sort函数最大的区别)

        2.5 简单使用

def sortedx(x):
    return x[0]
wlist=[(1,"a"),(3,"b"),(2,"c"),(4,"d")]

print(list(sorted(wlist,key=sortedx,reverse=False)))

# [(1, 'a'), (2, 'c'), (3, 'b'), (4, 'd')]

3.快速排序

        3.1 为什么学快排?

              很多友友包括我自己之前也有这样的疑问,你说python多好,一个sorted函数,感觉就能解决所有排序问题了,但是事实真的如此吗?现在之所以觉得sorted函数好用的大部分原因还是归结于数据量,数据量没到一定层次当然你肉眼是感受不出来sorted函数的效率的,让我们看看chatgpt怎么说的吧:

              Python 内置的 sorted() 函数使用的是 Timsort 算法,它是一种结合了归并排序和插入排序思想的稳定排序算法。它的时间复杂度在最坏情况下为 O(n\log n)O(nlogn),并且对于有序或部分有序的数组具有较高的效率。

        快速排序也是一种常用的排序算法,在大多数情况下排序速度非常快,其平均时间复杂度为 O(n\log n)O(nlogn),最坏情况下的时间复杂度为 O(n^2)O(n2)。但在最优情况下(即数据已经有序),快速排序的时间复杂度甚至可以达到 O(n)O(n),比 Timsort 更快。

        因此,总体而言,Timsort 相对于快速排序来说可能略慢一些,但它基本上能保证在所有情况下的稳定性和最差情况下的时间复杂度。而且,对于小规模的数据集,Timsort 采用插入排序可以更快地完成排序。所以,Timsort 在实际使用中非常常见,也是 Python 建议使用的默认排序算法。

        3.2 快排的基本实现思路(代码实例是从小到大)

                思路教学:传送锚点

                python代码实现:

#encoding=utf-8
def position(a,low,high):
    #取出a[low]位置元素作为比较位置pivots元素
    pivots = a[low]

    #比较过程
    while low<high:

        #因为a[low]位置的元素拿到比较位置pivots去了,所以现在可以把a[low]看作None
        #a[high]位置和pivots比较,只要a[high]比pivots大就一直high-=1,直到a[high]<pivots
        while(low<high and a[high]>pivots):
            high-=1

        #当a[high]<pivots时:把a[high]放到a[low]上,此时a[high]位置可以看作为None
        a[low]=a[high]

        #a[low]位置和pivots比较,只要a[low]比pivots小就一直low+=1直到a[low]>pivots
        while(low<high and a[low]<pivots):
            low+=1

        #当a[low]>pivots时就把a[low]放在a[high]所在位置上
        a[high]=a[low]

    #low = high 了
    a[low]=pivots
    return low

def quicksort(a,low,high):
    if (low<high):
        pivot = position(a, low, high)
        quicksort(a, low, pivot - 1)
        quicksort(a, pivot + 1, high)

a=[50,60,70,90,80,10,20,40]
quicksort(a,0,7)
print(list(a))

               

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值