冒泡排序和选择排序区别_数据结构与算法——冒泡排序、选择排序、插入排入和归并排序...

  1. 冒泡排序

一个list,起始位置为low,终止位置为high

冒泡关键是:相邻位置的数值比较,大的值装在后面的位置(内循环)。需要这样做len(list)-1次(外循环)

终止条件:迭代list结束,所以可以用for循环简单点

def bubbleSort(testlist):
    low = 1
    high = len(testlist)
    for j in range(high-1):
        for i in range(low, high-j):
            if testlist[i] < testlist[i-1]:
                testlist[i], testlist[i-1] = testlist[i-1], testlist[i]
    return testlist

def main():
    testlist =  [2,3,4,10,5,1,12,7,8]
    print(bubbleSort(testlist))

if __name__ == "__main__":
    main()

2. 选择排序

原理和冒泡排序一致,但是是倒着判断,把最小的值一直往前推

3.插入排序

举个例子,插入排序就像抓牌,每抓到一张牌就需要判断插入手中已排序的牌中哪个位置。

插入关键:假设手中已有的排序【1,2,10】,现在抓到牌4,4应该放在哪里呢,一个个从右往左比较,4比10小吗?是的==》4比2小吗?不是==》放在2,10中间

终止条件:当准备插入的值4比2大时,终止;插入到第一个位置时终止

def insertSort(testlist):
    low = 1
    high = len(testlist)
    for j in range(1, high):
        temp = testlist[j]
        for i in range(j,0,-1):
            if temp < testlist[i-1]:
                testlist[i],testlist[i-1] = testlist[i-1], testlist[i]
            else:
                break
    return testlist

def main():
    testlist =  [2,3,4,10,5,1,12,7,8]
    print(insertSort(testlist))

if __name__ == "__main__":
    main()

4. 归并排序

我感觉就像是一个list,对半分成两个list,变成二叉树,直到每个节点的list只存储一个值为止

然后,再排序,回到一个排好序的list

def merge(left,right):
    result = []
    i = j =0
    while i < len(left) and j < len(right):
        if left[i] > right[j]:
            result.append(right[j])
            j += 1
        else:
            result.append(left[i])
            i += 1
    if i == len(left):
        result.extend(right[j:len(right)]) #这边用extend,插入列表中的每个值,不能用append
    if j == len(right):
        result.extend(left[i:len(left)])
    return result

def mergeSort(testlist):
    if len(testlist) == 1:
        return testlist
    mid = len(testlist)//2
    left = mergeSort(testlist[:mid])
    right = mergeSort(testlist[mid:])
    return merge(left, right)

def main():
    testlist =  [2,3,4,10,5,1,12,7,8]
    print(mergeSort(testlist))

if __name__ == "__main__":
    main()

116e79547e4084756adada8c73162d22.png

恩……思路见上图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值