python排序

冒泡排序

冒泡排序需要多次遍历列表。它比较相邻的项并交换那些无序的项。每次遍历列表将下一个最大的值放在其正确的位置(靠右)。实质上,每个项“冒泡”到它所属的位置。

 

def bubbleSort(alist):
    for passnum in range(len(alist)-1,0,-1): #冒泡排序每次都会将最大值靠右排序,所以下次排序就不惜要比较最后一个值了,他的循环次数也是 n,n-1,n-2的递减   
        for i in range(passnum):
            if alist[i]>alist[i+1]:   #如果左边的数字大于右边
                temp = alist[i]       #那么进行互换,使用中间值保留其中一个值
                alist[i] = alist[i+1]
                alist[i+1] = temp

有时列表是已经有顺序的,或者排序几次后就有了顺序,那么剩下部分就不需要进行循环比较了,可以通过判断有没有发生左右互换的情况来判断是否发生排序,如果没有,说明左边的值均小于右边,下面的优化的冒泡排序

def shortbubbleSort(alist):
    exchange = True                  #用于判断是否发生冒泡
    passnum  = len(alist) -1
    while passnum > 0 and  exchange :  #使用whie循环,可以结合条件决定是否继续排序
        exchange = False
        print('paixu')
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                temp = alist[i]
                alist[i] = alist[i+1]
                alist[i+1] = temp
                exchange = True
    passnum = passnum -1

选择排序

选择排序改进了冒泡排序,每次遍历列表只做一次交换。为了做到这一点,一个选择排序在他遍历时寻找最大的值,并在完成遍历后,将其放置在正确的位置。与冒泡排序一样,在第一次遍历后,最大的项在正确的地方。 第二遍后,下一个最大的就位。遍历 n-1 次排序 n 个项,因为最终项必须在第(n-1)次遍历之后。

 同冒泡排序一样,每次找到相对最值放在最后面,每次遍历后,下次需要遍历的元素减1,

def selectionSort(alist):
    for passnum in range(len(alist)-1,0,-1):
        position = 0    #用来记录最终要交换的位置
        for i in range(passnum+1):
            if alist[i]>alist[position]:   #遍历未排序列表,找到最大的值
                position = i
        temp = alist[passnum]   #找到最大值后放在最后面
        alist[passnum] = alist[position]
        alist[position] = temp

插入排序

插入排序,尽管仍然是 O(n^2 ),工作方式略有不同。它始终在列表的较低位置维护一个排序的子列表。然后将每个新项 “插入” 回先前的子列表,使得排序的子列表称为较大的一个项。

def insertionSort(alist):
    for index in range(1,len(alist)):
        currentvalue = alist[index] #从列表第二个元素开始进行插值排序
        position = index  #position会记录最大值的位置
        while position>0 and alist[position-1]>currentvalue:   #将子列表即左侧列表每个元素与将要差值的元素比较,较小的将被额外储存并覆盖
            alist[position]=alist[position-1]
            position = position-1
        alist[position]=currentvalue #最大值去了当前值位置,所以要用当前值填补

各种排序时间复杂度对比

import random

bubble_nlogn = []
selection_nlogn = []
insertion_nlogn = []

bubble_c = Timer("bubbleSort(new_list)", "from __main__ import bubbleSort,new_list")
selection_c = Timer("selectionSort(new_list)", "from __main__ import selectionSort,new_list")
insertion_c = Timer("insertionSort(new_list)", "from __main__ import insertionSort,new_list")

x = list(range(100,1000,100))

for i in x:
    new_list = [random.choice(range(i)) for j in range(i)]
    bubble_nlogn.append(bubble_c.timeit(number = 10))
    selection_nlogn.append(selection_c.timeit(number = 10))
    insertion_nlogn.append(insertion_c.timeit(number = 10))

plt.plot(x, bubble_nlogn,marker='o',label='bubble')
plt.plot(x, selection_nlogn,marker='o',label='selection')
plt.plot(x, insertion_nlogn,marker='o',label='insertion')

plt.legend()  # 让图例生效
plt.xlabel('n size')  # X轴标签
plt.ylabel("time use")  # Y轴标签

plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海人001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值