python 基础知识点(蓝桥杯python科目个人复习计划39)

今日复习内容:排序

昨天晚上快睡的时候,脑子里就突然想到了排序,所以就打算再复习一遍相关知识点。

我先说一下冒泡排序,冒泡排序其实很好理解,比如有n个人排队(从矮到高),先从这n个人中找出最高的那个,放到最后,然后忽略最高的那个,从剩余的n-1个人中再找出最高的那个,一直重复这个操作,就完成了排队,在这个过程中,最矮的那个同学是最后才排的,而且比他高的n-1个人都排好了,他就直接去剩下的那个位置就行,因此,虽然有n个人,只需要排n-1次就行,这就是冒泡排序的基本原理,它的时间复杂度是O(n^2),所以应该使用双重循环。

现在,我来把它编成代码:

n = int(input('请输入一个整数:'))
a = list(map(int,input().split()))
for i in range(1,n):
    for j in range(n - i):
        if a[j] > a[j + 1]:
            a[j],a[j + 1] = a[j + 1],a[j]
print(' '.join(map(str,a)))

运行结果:

 

简单来说,就是一直找最大的那个数,一直往后排,最小的数字放第一位就行。

然后是选择排序,我举个例子,有n个同学排队(从矮到高),从这n个同学中找出最矮的那个,放在第一位,然后忽略它,再从剩余的n - 1个同学中找出最矮的那个,一直重复该操作,等前面n - 1个同学都排好了,最高的那个都不用重复上述操作了,直接去最后就行,所以,虽然有n个同学排队,但是只需要n - 1次排列,它的时间复杂度仍然是O(n^2)。

现在,我来把它编成代码:

n = int(input('请输入一个整数:'))
a = list(map(int,input().split()))
for i in range(0,n - 1):
    min_value = a[i]
    min_idx = i
    for j in range(i,n):
        if a[j] < min_value:
            min_value = a[j]
            min_idx = j
    a[i],a[min_idx] = a[min_idx],a[i]
print(' '.join(map(str,a)))

运行结果:

 

这个做法呢,就是一直找小的数,最大的那个直接放最后就行。

接下来是插入排序,我举个例子,有n个 同学排队(从矮到高),首先,先站成一排,不管顺序,先把n个位置占满,此时,将第一个同学看作已经排列正确的,然后,从最后一个开始,两个两个的比较,比你前面高的,你就在后面站着,如果你比前面那个矮,就往前排,一个一个的插进去,但是呢,n - 1个人都排好了,剩着的那个直接去空位上就行,所以,虽然有n个人参与排队,但是,n-1次循环就搞定了,时间复杂度仍然是O(n^2)这就是插入排序的基本原理。

现在,我来把它编成代码。

n = int(input('请输入一个正整数:'))
a = list(map(int,input().split()))
for i in range(1,n):
    value = a[i]
    insert_idx = 0
    for j in range(i - 1,-1,-1):
        if a[j] > value:
            a[j + 1] = a[j]
        else:
            insert_idx = j + 1
            break
    a[insert_idx] = value
print(' '.join(map(str,a)))

运行结果:

 

下一个,是快速排序,我举个例子。有n个同学排队(从矮到高),随便找出一个同学A,让他站着别动,然后,把剩下的这n-1个同学分成两部分,一部分比他矮,另一部分比他高,然后矮的那些同学就排在同学A前面,高的那部分同学就排在A同学后面,最后,分别对这两部分的同学按顺序排列就行了,这个方法的时间复杂度和空间复杂度就比较复杂了,是O(nlogn)(我记得我在某一篇里写过),这就是快速排序的基本原理。

现在,我来把它编成代码:

def partition(a,left,right):
    idx = left + 1
    for i in range(left + 1,right + 1):
        if a[i] <= a[left]:
            a[i],a[idx] = a[idx],a[i]
            idx += 1
    a[left],a[idx - 1] = a[idx - 1],a[left]
    return idx - 1


def quicksort(a,left,right):
    if left < right:
        mid = partition(a,left,right)
        quicksort(a,left,mid - 1)
        quicksort(a,mid + 1,right)


n = int(input('请输入一个整数:'))
a = list(map(int,input().split()))
quicksort(a,0,n - 1)
print(' '.join(map(str,a)))

运行结果:

 

接下来是归并排序,我举个例子:

有两个列表a和b,我要把它们合并起来,假设a是空的,则只需要排列一下b内的元素(从小到大),b为空时操作一样,有点意思的就是两个列表都不为空,那就一个元素一个元素的比就可以了。

现在,我来把它编成代码:

n = int(input('请输入一个整数:'))
a = list(map(int,input().split()))


def Merge(a,b):
    result = []
    while len(a) != 0 and len(b) != 0:
        if a[0] <= b[0]:
            result.append(a.pop(0))
        else:
            result.append(b.pop(0))
    result.extend(a)
    result.extend(b)
    return result

def Mergesort(a):
    if len(a) < 2:
        return a
    mid = len(a) // 2
    left = Mergesort(a[:mid])
    right = Mergesort(a[mid:])
    return Merge(left,right)

print(' '.join(map(str,Mergesort(a))))

运行结果:

 

OK,终于写完了,我待会儿会继续复习的,那这篇就这样吧。

代码方面有问题的话,可以给我发私信的,一起交流讨论,备战蓝桥杯!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值