楼主是双非一本非计算机专业的小菜鸡,正在备战蓝桥杯,自学算法,用这篇文章记录课程中伪代码的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