python实现插入排序、冒泡排序、快速排序

a= [2,4,2,6,5,8,5,56,45,3,23]

1. 插入排序

插入排序类似整理扑克牌,将每一张牌插到其他已经有序的牌中适当的位置。

插入排序由N-1趟排序组成,对于P=1到N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。

简单的说,就是插入排序总共需要排序N-1趟,从index为1开始,讲该位置上的元素与之前的元素比较,放入合适的位置,这样循环下来之后,即为有序数组。

#插入排序
def InsertSort(a):
    lenlist = len(a)
    for i in range(1,lenlist):
        x = a[i]
        for j in range(i,-1,-1):
            if x < a[j-1]:
                a[j] = a[j-1]
            else:
                break
        a[j] = x
    print(a)

InsertSort(a)

效率:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)

2. 冒泡排序

1)、从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置。

2)、指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置。

3)、依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面。

4)、依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置。

5)、重复上述过程,没排完一轮,比较次数就减少一次。

#冒泡排序
def Msort(a):
    length = len(a)
    for i in range(length):
        for j in range(length-1-i):
            if a[j]>a[j+1]:
                temp = a[j]
                a[j] = a[j+1]
                a[j+1] = temp
    print(a)
Msort(a)

效率:N个元素需要排序N-1轮;

第i轮需要比较N-i次;

N个元素排序,需要比较n(n-1)/2次;

冒泡排序的算法复杂度较高,为O(n*n)

3. 快速排序

定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没有走到中间,则交换左面大于阈值的数据和右面小于阈值的数据;重复上述过程,直到左面指针和右面指针相遇,此时左面数据均小于阈值,右面数据均大于阈值,划分结束。划分结束后,数据仍然是无序的,但更接近于有序。


#快速排序
def Quicksort(a,start,end):
    if start < end:
        i,j = start,end
        base = a[i]
        while i < j:
            while (i<j) and (base <= a[j]):
                j -= 1
            a[i] = a[j]

            while (i<j) and (base >= a[i]):
                i += 1
            a[j] = a[i]
        a[i] = base
        Quicksort(a,start,i-1)
        Quicksort(a,j+1,end)
    return a
    
b = Quicksort(a,0,len(a)-1)
print(b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值