北航童老师《算法设计与分析》(真的在更新)

楼主是双非一本非计算机专业的小菜鸡,正在备战蓝桥杯,自学算法,用这篇文章记录课程中伪代码的python实现。如果发现代码有问题或者有更优解,又或者是哪里不明白,可以私信楼主哦

!!:部分代码有优解更新,楼主正在重新过一遍

选择排序法

n=eval(input())
a=[]
for i in range(n):
    a.append(eval(input()))
print(a)
for i in range(0,n-1):
    min=a[i]
    pos=i
    for j in range(i+1,n):
        while a[j]<min:
            min=a[j]
            pos=j
    a[pos]=a[i]
    a[i]=min
print(a)

插入排序法

print("请输入需要排序的个数:")
n=eval(input())
a=[]
for i in range(n):
    a.append(eval(input()))
for i in range(1,n):
    key=a[i]
    j=i-1
    while j>-1 and a[j]>key:
        a[j+1]=a[j]
        j=j-1
    a[j+1]=key
print(a)

归并排序法


这篇写了四个小时,有个小错误没发现,一直出不来答案,菜鸡落泪

n=eval(input())
c=[]
c1=[]
for i in range(n):
    c.append(eval(input()))
    c1.append(0)
    
def mergesort(c,left,right):
    if left<right:
        mid=int((left+right)//2)
        mergesort(c,left,mid)
        mergesort(c,mid+1,right)
        merge(c,left,mid,right)
        return merge(c,left,mid,right)
def merge(c,left,mid,right):
    i=left
    j=mid+1
    k=left
    while i <= mid and j <= right:
        if c[i]<c[j]:
            c1[k]=c[i]
            i=i+1
        elif c[j]<c[i]:
            c1[k]=c[j]
            j=j+1
        k=1+k
            
    if i>mid:
        for d in range(j,right+1):
            c1[k]=c[d]
            k+=1
    else:
        for d in range(i,mid+1):
            c1[k]=c[d]
            k+=1
    i=left
    while i<=right:
        c[i]=c1[i]
        i+=1
    return c
print(mergesort(c,0,len(c)-1))

一天后当我学完最大子数组再看我第一次发的代码,发现错了(现在以上是对的)
1.之前犯的错误是merge中的return返回的不是c,仔细想想mergesort实际是用于拆分最终把数组变成只有单个数字的列表,merge相当于把按顺序相邻的两个切片排序后组合,然后更新c中的这一切片
2.起初要定义两个长度列表,c1可以和c一起按相同循环次数添加数据
3.merge中,先将排序后的数逐个替换c1中的元素,然后再将c1中替换过的元素逐个赋值给c

注意:这里千万不能直接c=c1,因为c与c1的长度是不变的恒定为最初长度,而c1每次都只更新从left到right这几个元素(mergesort的切分使得每一次merge对应的left与right都不一样),除此外c1的未更新过的元素应都为0,故不能直接等于

带有老师思维的优解代码(可读性更强):

n=eval(input())
c=[]
for i in range(n):
    c.append(eval(input()))
    
def MergeSort(c):
    if len(c
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值