Python 排序

参考

完整code放在我的github

 

括号中为平均时间复杂度

1. 冒泡排序(O(n2)O(n2))

第一个数和剩下的依次比较,大的下沉(升序),第二个数和剩下的依次比较,。。。,依次类推

def bubble_sort(a):
    for i in range(len(a) - 1):  ##最后一个数不用比较
        for j in range(len(a) - i - 1):
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                print(a)
    return a
a=[8,3,2,7,5,1,6]
print(bubble_sort(a))

Output:

[3, 8, 2, 7, 5, 1, 6]
[3, 2, 8, 7, 5, 1, 6]
[3, 2, 7, 8, 5, 1, 6]
[3, 2, 7, 5, 8, 1, 6]
[3, 2, 7, 5, 1, 8, 6]
[3, 2, 7, 5, 1, 6, 8]
[2, 3, 7, 5, 1, 6, 8]
[2, 3, 5, 7, 1, 6, 8]
[2, 3, 5, 1, 7, 6, 8]
[2, 3, 5, 1, 6, 7, 8]
[2, 3, 1, 5, 6, 7, 8]
[2, 1, 3, 5, 6, 7, 8]
[1, 2, 3, 5, 6, 7, 8]
[1, 2, 3, 5, 6, 7, 8]

2. 直接选择排序(O(n2)O(n2))

每次从待排序序列中选出最小值放到待排序序列之首

def selection_sort(a):    
    for i in range(len(a)-1):
        j = a.index(min(a[i:]))
        if j != i:
            a[i], a[j] = a[j], a[i]
            print(a)
    return a
a=[8,3,2,7,5,1,6]
print(selection_sort(a))

Output:

[1, 3, 2, 7, 5, 8, 6]
[1, 2, 3, 7, 5, 8, 6]
[1, 2, 3, 5, 7, 8, 6]
[1, 2, 3, 5, 6, 8, 7]
[1, 2, 3, 5, 6, 7, 8]
[1, 2, 3, 5, 6, 7, 8]

3. 直接插入排序(O(n2)O(n2))

 

列表被分为有序区和无序区两个部分。最初有序区只有一个元素。 每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

def insert_sort(a):
    for i in range(1,len(a)):
        insert_num = a[i]
        j = i - 1
        while j >= 0 and insert_num < a[j]:
            a[j+1] = a[j]
            j -= 1
        a[j+1] = insert_num
        print(a)
    return a
a = [8,3,2,7,5,1,6]
insert_sort(a)

Output:

[3, 8, 2, 7, 5, 1, 6]
[2, 3, 8, 7, 5, 1, 6]
[2, 3, 7, 8, 5, 1, 6]
[2, 3, 5, 7, 8, 1, 6]
[1, 2, 3, 5, 7, 8, 6]
[1, 2, 3, 5, 6, 7, 8]
[1, 2, 3, 5, 6, 7, 8]

4.快速排序(O(nlogn)O(nlogn))

先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组。然后对这两个子数组再递归重复上述过程,直到两个子数组的所有数都分别有序。最后返回“左子数组” + “基准数” + “右子数组”,即是最终排序好的数组。

def quick_sort(a):   
    if len(a)<=1:
        return a
    else:
        list_left=[];list_right=[];list_p=[]
        for i in a:
            if i > a[-1]:
                list_right.append(i)
            elif i<a[-1]:
                list_left.append(i)
            else:
                list_p.append(i)
        list_left = quick_sort(list_left)
        list_right = quick_sort(list_right)
        list=list_left+list_p+list_right
        print(list)
        return list
a=[8,3,2,7,5,1,6]
print(quick_sort(a))

Output:

[2, 3]
[2, 3, 5]
[1, 2, 3, 5]
[7, 8]
[1, 2, 3, 5, 6, 7, 8]
[1, 2, 3, 5, 6, 7, 8]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值