【Python】排序问题小结

1、排序算法性能总结

排序方法平均时间复杂度最差时间复杂度最好时间复杂度空间复杂度稳定性
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
冒泡排序O(n^2)O(n^2)O(n)O(1)稳定
双向冒泡排序O(n^2)O(n^2)O(n)O(1)稳定
插入排序O(n^2)O(n^2)O(n)O(1)稳定
希尔排序O(n^1.3)O(n^2)O(n)O(1)不稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(n)稳定
快排O(nlogn)O(n^2)O(nlogn)O(logn)不稳定

2、几点疑问,以及我个人觉得比较好的解答:

3、Po代码:

#1、选择排序
def selection_sort(list_x):
    for i in range(0, len(list_x)):
        min_index = i
        for j in range(i+1, len(list_x)):
            if list_x[j] < list_x[min_index]:
                min_index = j
            if i != min_index:
                list_x[i], list_x[min_index] = list_x[min_index], list_x[i]
    return list_x

#2、冒泡排序
def bubble_sort(list_x):

    n = len(list_x)

    for i in range(n-1):

        count = 0
        
        for j in range(n-1-i):

            if list_x[j] > list_x[j+1]:
                list_x[j], list_x[j+1] = list_x[j+1], list_x[j]
                count += 1
        if count == 0:
            break
    return list_x

#3、双向冒泡排序(鸡尾酒排序)
def bidirectionalbubble_sort(x):
    j = 0
    while j <= len(x)//2:
       flag = False
       for i in range(j ,len(x) - j -1):
           if x[i]>x[i+1]:
               x[i], x[i+1] = x[i+1], x[i]
               flag=True
       for i in range(len(x)- 1 - j,j,-1):
           if x[i]<x[i-1]:
               x[i], x[i-1] = x[i-1], x[i]
               flag=True    
       if not flag:  
           return x
       j += 1
    return x

#4. 插入排序算法
def insert_sort(x):
    for i in range(1,len(x)):
        j = i-1
        item = x[i]
        while item < x[j] and j>=0:
            x[j], x[j+1] = x[j+1], x[j]
            j -= 1
        x[j+1] = item
    return x

#5. 希尔排序
##  与插入排序的不同之处在于,它会优先比较距离较远的元素
##  排序的本质是消除逆序对,优先比较距离较远的元素,使得一次交换能够消除一个以上的逆序对
def shell_sort(alist):
    n = len(alist)
    gap = n // 2
    while gap >= 1:
        for j in range(gap, n):
            i = j
            while (i - gap) >= 0:
                if alist[i] < alist[i - gap]:
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    i -= gap
                else:
                    break
        gap //= 2


#6. 归并排序
def merge (a, b):
    help = []
    i = j = 0
    while i < len(a) and j < len(b):
        if a[i] < b[j]:
            help.append(a[i])
            i += 1
        else:
            help.append(b[j])
            j += 1
    if i == len(a):
        for num in b[j:]:
            help.append(num)
    else:
        for num in a[i:]:
            help.append(num)
    return help

def merge_sort(alist):
    if len(alist) <= 1:
        return alist
    mid_index = len(alist) // 2
    left = merge_sort(alist[: mid_index])
    right = merge_sort(alist[mid_index :])
    return(merge(left, right))


#7. 快排
def quick_sort(alist):
    mid_index = len(alist) // 2
    if mid_index == 0:
        return alist
    mid = []
    left = []
    right = []
    for i in range(len(alist)):
        if alist[i] < alist[mid_index]:
            left.append(alist[i])
        elif alist[i] == alist[mid_index]:
            mid.append(alist[i])
        else:
            right.append(alist[i])
    return quick_sort(left)+mid+quick_sort(right)


if __name__ == '__main__':
    list_a = [1, 5, 6, 2, 1, 9, 3, 8, 9, 12]
    print(bubble_sort(list_a))
    print(selection_sort(list_a))
    print(bidirectionalbubble_sort(list_a))
    print(insert_sort(list_a))
    print(merge_sort(list_a))
    print(quick_sort(list_a))

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值