常见排序算法

3 篇文章 0 订阅
2 篇文章 0 订阅

1.冒泡排序

def bubble_sort(alist):
    """冒泡排序"""
    # 外层循环控制循环次数
    for j in range(len(alist)-1):
        # j [0, 1,2,...n-2]
        #n-2-j
        count = 0
        # 内层循环控制从头走到尾的遍历
        for i in range(0,len(alist)-1-j):
            if alist[i]>alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
                count += 1
        if 0 == count:
            break
if __name__ =='__main__':
    li =[54,26,77,17,77,31,44,55,20]
    print(li)
    bubble_sort(li)
    print(li)

  • 详细运行过程
---------------未排序的列表-------------
[54, 26, 77, 17, 77, 31, 44, 55, 20]
____第一个for循环第0执行过程_____________
[26, 54, 77, 17, 77, 31, 44, 55, 20]
[26, 54, 17, 77, 77, 31, 44, 55, 20]
[26, 54, 17, 77, 31, 77, 44, 55, 20]
[26, 54, 17, 77, 31, 44, 77, 55, 20]
[26, 54, 17, 77, 31, 44, 55, 77, 20]
[26, 54, 17, 77, 31, 44, 55, 20, 77]
****第一个for循环执行第0次的结果*********
[26, 54, 17, 77, 31, 44, 55, 20, 77]
____第一个for循环第1执行过程____________
[26, 17, 54, 77, 31, 44, 55, 20, 77]
[26, 17, 54, 31, 77, 44, 55, 20, 77]
[26, 17, 54, 31, 44, 77, 55, 20, 77]
[26, 17, 54, 31, 44, 55, 77, 20, 77]
[26, 17, 54, 31, 44, 55, 20, 77, 77]
****第一个for循环执行第1次的结果*********
[26, 17, 54, 31, 44, 55, 20, 77, 77]
____第一个for循环第2执行过程_____________
[17, 26, 54, 31, 44, 55, 20, 77, 77]
[17, 26, 31, 54, 44, 55, 20, 77, 77]
[17, 26, 31, 44, 54, 55, 20, 77, 77]
[17, 26, 31, 44, 54, 20, 55, 77, 77]
****第一个for循环执行第2次的结果*************
[17, 26, 31, 44, 54, 20, 55, 77, 77]
____第一个for循环第3执行过程_____________
[17, 26, 31, 44, 20, 54, 55, 77, 77]
****第一个for循环执行第3次的结果*************
[17, 26, 31, 44, 20, 54, 55, 77, 77]
____第一个for循环第4执行过程_____________
[17, 26, 31, 20, 44, 54, 55, 77, 77]
****第一个for循环执行第4次的结果*************
[17, 26, 31, 20, 44, 54, 55, 77, 77]
____第一个for循环第5执行过程_____________
[17, 26, 20, 31, 44, 54, 55, 77, 77]
****第一个for循环执行第5次的结果*************
[17, 26, 20, 31, 44, 54, 55, 77, 77]
____第一个for循环第6执行过程_____________
[17, 20, 26, 31, 44, 54, 55, 77, 77]
****第一个for循环执行第6次的结果*************
[17, 20, 26, 31, 44, 54, 55, 77, 77]
____第一个for循环第7执行过程_____________
****第一个for循环执行第7次的结果*************
[17, 20, 26, 31, 44, 54, 55, 77, 77]
---------------排序后的列表----------------
[17, 20, 26, 31, 44, 54, 55, 77, 77]

2.选择排序

def select_sort(alist):
    """选择排序"""
    for j in range(len(alist)-1):
        print("____第一个for循环第%d执行过程_____________"%j )
        for i in range(j+1,len(alist)):
            if alist[i] < alist[j]:
                alist[i] ,alist[j] = alist[j],alist[i]
                print(alist)
        print("****第一个for循环执行第%d次的结果*************"%j )
        print(alist)
if __name__ == '__main__':
    li = [54,26,93,17,77,31,44,55,20]
    print("---------------未排序的列表---------------")
    print(li)
    select_sort(li)
    print("---------------排序后的列表----------------")
    print(li)

  • 详细运行过程
---------------未排序的列表---------------
[54, 26, 93, 17, 77, 31, 44, 55, 20]
____第一个for循环第0执行过程_____________
[26, 54, 93, 17, 77, 31, 44, 55, 20]
[17, 54, 93, 26, 77, 31, 44, 55, 20]
****第一个for循环执行第0次的结果*************
[17, 54, 93, 26, 77, 31, 44, 55, 20]
____第一个for循环第1执行过程_____________
[17, 26, 93, 54, 77, 31, 44, 55, 20]
[17, 20, 93, 54, 77, 31, 44, 55, 26]
****第一个for循环执行第1次的结果*************
[17, 20, 93, 54, 77, 31, 44, 55, 26]
____第一个for循环第2执行过程_____________
[17, 20, 54, 93, 77, 31, 44, 55, 26]
[17, 20, 31, 93, 77, 54, 44, 55, 26]
[17, 20, 26, 93, 77, 54, 44, 55, 31]
****第一个for循环执行第2次的结果*************
[17, 20, 26, 93, 77, 54, 44, 55, 31]
____第一个for循环第3执行过程_____________
[17, 20, 26, 77, 93, 54, 44, 55, 31]
[17, 20, 26, 54, 93, 77, 44, 55, 31]
[17, 20, 26, 44, 93, 77, 54, 55, 31]
[17, 20, 26, 31, 93, 77, 54, 55, 44]
****第一个for循环执行第3次的结果*************
[17, 20, 26, 31, 93, 77, 54, 55, 44]
____第一个for循环第4执行过程_____________
[17, 20, 26, 31, 77, 93, 54, 55, 44]
[17, 20, 26, 31, 54, 93, 77, 55, 44]
[17, 20, 26, 31, 44, 93, 77, 55, 54]
****第一个for循环执行第4次的结果*************
[17, 20, 26, 31, 44, 93, 77, 55, 54]
____第一个for循环第5执行过程_____________
[17, 20, 26, 31, 44, 77, 93, 55, 54]
[17, 20, 26, 31, 44, 55, 93, 77, 54]
[17, 20, 26, 31, 44, 54, 93, 77, 55]
****第一个for循环执行第5次的结果*************
[17, 20, 26, 31, 44, 54, 93, 77, 55]
____第一个for循环第6执行过程_____________
[17, 20, 26, 31, 44, 54, 77, 93, 55]
[17, 20, 26, 31, 44, 54, 55, 93, 77]
****第一个for循环执行第6次的结果*************
[17, 20, 26, 31, 44, 54, 55, 93, 77]
____第一个for循环第7执行过程_____________
[17, 20, 26, 31, 44, 54, 55, 77, 93]
****第一个for循环执行第7次的结果*************
[17, 20, 26, 31, 44, 54, 55, 77, 93]
---------------排序后的列表----------------
[17, 20, 26, 31, 44, 54, 55, 77, 93]

3,插入排序

def inser_sort(alist):
    """插入排序"""
    n = len(alist)
    for j in range(1,n):
        for i in range(j, 0, -1):
            if alist[i] < alist[i-1]:
                alist[i], alist[i-1] = alist[i-1],alist[i]
            else:
                break
            #print(alist)
if __name__ ==  '__main__':
    li = [ 54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    inser_sort(li)
    print(li)

---------------未排序的列表---------------
[54, 26, 93, 17, 77, 31, 44, 55, 20]
____外层for循环第1次执行过程_____________
[26, 54, 93, 17, 77, 31, 44, 55, 20]
____外层for循环第2次执行过程_____________
____外层for循环第3次执行过程_____________
[26, 54, 17, 93, 77, 31, 44, 55, 20]
[26, 17, 54, 93, 77, 31, 44, 55, 20]
[17, 26, 54, 93, 77, 31, 44, 55, 20]
____外层for循环第4次执行过程_____________
[17, 26, 54, 77, 93, 31, 44, 55, 20]
____外层for循环第5次执行过程_____________
[17, 26, 54, 77, 31, 93, 44, 55, 20]
[17, 26, 54, 31, 77, 93, 44, 55, 20]
[17, 26, 31, 54, 77, 93, 44, 55, 20]
____外层for循环第6次执行过程_____________
[17, 26, 31, 54, 77, 44, 93, 55, 20]
[17, 26, 31, 54, 44, 77, 93, 55, 20]
[17, 26, 31, 44, 54, 77, 93, 55, 20]
____外层for循环第7次执行过程_____________
[17, 26, 31, 44, 54, 77, 55, 93, 20]
[17, 26, 31, 44, 54, 55, 77, 93, 20]
____外层for循环第8次执行过程_____________
[17, 26, 31, 44, 54, 55, 77, 20, 93]
[17, 26, 31, 44, 54, 55, 20, 77, 93]
[17, 26, 31, 44, 54, 20, 55, 77, 93]
[17, 26, 31, 44, 20, 54, 55, 77, 93]
[17, 26, 31, 20, 44, 54, 55, 77, 93]
[17, 26, 20, 31, 44, 54, 55, 77, 93]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
---------------排序后的列表----------------
[17, 20, 26, 31, 44, 54, 55, 77, 93]

4,希尔排序

def shell_sort(alist):
    """希尔排序"""
    n = len(alist)
    gap = n//2
    print("gap的值为%d" %gap)
    while gap >= 1:
        #插入排序算法
        for j in range(gap,n):
             # 处理元素向前遍历插入到相应的位置上
            print("j的值为%d"%j)
            i = j
            while (i-gap) >= 0:
                if alist[i] < alist[i-gap]:
                    alist[i], alist[i-gap] = alist[i-gap],alist[i]
                    i -= gap
                    print("i的值为%d" %i)
                else:
                    break
                print(li)
        #缩短gap间隔
        gap //= 2
        print("gap的值为%d" %gap)
if __name__ == '__main__':
    li = [54,26,93,17,77,31,44,55,20]
    print("---------------未排序的列表---------------")
    print(li)
    shell_sort(li)
    print("---------------排序后的列表----------------")
    print(li)

  • 详细运行结果
---------------未排序的列表---------------
[54, 26, 93, 17, 77, 31, 44, 55, 20]
gap的值为4
j的值为4
j的值为5
j的值为6
i的值为2
[54, 26, 44, 17, 77, 31, 93, 55, 20]
j的值为7
j的值为8
i的值为4
[54, 26, 44, 17, 20, 31, 93, 55, 77]
i的值为0
[20, 26, 44, 17, 54, 31, 93, 55, 77]
gap的值为2
j的值为2
j的值为3
i的值为1
[20, 17, 44, 26, 54, 31, 93, 55, 77]
j的值为4
j的值为5
j的值为6
j的值为7
j的值为8
i的值为6
[20, 17, 44, 26, 54, 31, 77, 55, 93]
gap的值为1
j的值为1
i的值为0
[17, 20, 44, 26, 54, 31, 77, 55, 93]
j的值为2
j的值为3
i的值为2
[17, 20, 26, 44, 54, 31, 77, 55, 93]
j的值为4
j的值为5
i的值为4
[17, 20, 26, 44, 31, 54, 77, 55, 93]
i的值为3
[17, 20, 26, 31, 44, 54, 77, 55, 93]
j的值为6
j的值为7
i的值为6
[17, 20, 26, 31, 44, 54, 55, 77, 93]
j的值为8
gap的值为0
---------------排序后的列表----------------
[17, 20, 26, 31, 44, 54, 55, 77, 93]

5,快速排序

def quick_sort(alist, start, end):
    """快速排序"""
    if start >= end:
        return
    mid = alist[start]
    left = start
    right = end

    # left与right未重合,就向中间移动
    while left < right:
        while left < right and alist[right] >= mid:
            right -= 1
        alist[left] = alist[right]
        while left < right and alist[left] < mid:
            left += 1
        alist[right] = alist[left]
    # 从循环退出后,left与right相遇,即left==right
    alist[left] = mid

    # 对左边部分执行快速排序
    quick_sort(alist, start, left-1)

    # 对右边部分执行快速排序
    quick_sort(alist, left+1, end)

if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    quick_sort(li, 0, len(li)-1)
    print(li)

6归并排序

def merge_sort(alist):
    """归并排序"""
    n = len(alist)
    if 1 == n:
        return alist
    mid = n // 2

    # 对左半部分进行归并排序
    left_sorted_li = merge_sort(alist[:mid])

    # 对右半部分进行归并排序
    right_sorted_li = merge_sort(alist[mid:])

    # 合并两个有序集合
    left, right = 0, 0
    merge_sorted_li = []

    left_n = len(left_sorted_li)
    right_n = len(right_sorted_li)

    while left < left_n and right < right_n:
        if left_sorted_li[left] <= right_sorted_li[right]:
            merge_sorted_li.append(left_sorted_li[left])
            left += 1
        else:
            merge_sorted_li.append(right_sorted_li[right])
            right += 1

    merge_sorted_li += left_sorted_li[left:]
    merge_sorted_li += right_sorted_li[right:]

    return merge_sorted_li

if __name__ == '__main__':
    alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print("before sort: %s" % alist)
    sorted_alist = merge_sort(alist)
    print("after sort: %s" % alist)
    print("sorted new list: %s" % sorted_alist)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值