蓝桥杯python组——宝藏排序Ⅰ、Ⅱ(冒泡排序,选择排序,插入排序,快速排序,归并排序)

问题描述

在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量这批宝藏的顺序被打乱了,探险队需要将宝藏按照珍贵程度进行排序,以便更好地研究和保护它们。作为探险队的一员,肖恩需要设计合适的排序算法来将宝藏按照珍贵程度进行从小到大排序。

输入描述

输入第一行包括一个数字n,表示宝藏总共有n个
输入的第二行包括n个数字,第个数字a[i]表示第i个宝藏的珍贵程度
数据保证1<=n<=10^3,1<=a[i] <=10^6(题目Ⅰ要求)
数据保证1<=n<=10^5,1<=a[i] <=10^9(题目Ⅱ要求)

输出描述

输出n个数字,为对宝藏按照珍贵程度从小到大排序后的数组

样例输入

5
1 5 9 3 7

样例输出

1 3 5 7 9

实验代码

def bubble_sort(a,n):
    '''
    冒泡排序,第一次循环排好最后一个位置,然后依次往前排列
    '''
    #外层循环次数
    for i in range(1,n):
        #ide = 0
        #ide_value = a[ide]
        for j in range(n-i):
            if a[j] > a[j+1]:
                a[j+1],a[j] = a[j],a[j+1]

def select_sort(a,n):
    '''
    选择排序,第一次循环排好第一个位置,然后依次往后排列
    '''
    for i in range(n-1):
        ide = i
        ide_value = a[ide]
        for j in range(i+1,n):
            if a[j] < a[ide]:
                ide = j
        if i != ide: 
            a[i],a[ide] = a[ide],a[i]

def insert_sort(a,n):
    '''
    插入排序,每次循环排列好前面的几个位置,类似与整理扑克牌的方法
    '''
    for i in range(1,n):
        #记录插入点位置和值
        ide = i
        ide_value = a[ide]
        for j in range(i-1,-1,-1):
            #判断合适的插入点
            if a[j] > ide_value:
                a[j+1] = a[j]
                ide -= 1
        #将该值插入指定位置
        a[ide] = ide_value
            
def quick_sort_part(a,left,right):
    '''
    快速排序组成部分,寻找一个数做参考轴,将值比轴小的放在左边,大的放右边
    '''
    #将比轴大的放在轴左侧
    ide = left + 1
    for i in range(ide,right+1):
        if a[left] >= a[i]:
            a[i],a[ide] = a[ide],a[i]
            ide += 1
    a[left],a[ide-1] = a[ide-1],a[left]
    return ide -1
def quick_sort(a,left,right):
    '''
    快速排序,将问题分割,采用递归方式解决问题
    '''
    if left <= right:
        mid=quick_sort_part(a,left,right)
        quick_sort(a,left,mid-1)
        quick_sort(a,mid+1,right)


def merge_sort_part(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 merge_sort(a):
    '''
    归并排序,将列表分成两个列表,递归上述过程,在将所分成的小列表合并成排好序的大列表
    '''
    mid = len(a) // 2
    if len(a) < 2:
        return a
    a_lis = merge_sort(a[:mid])
    b_lis = merge_sort(a[mid:])
    return merge_sort_part(a_lis,b_lis)

n = int(input())
lis = list(map(int,input().split()))
#bubble_sort(lis,n)
#select_sort(lis,n)
#insert_sort(lis,n)
quick_sort(lis,0,len(lis)-1)
#lis_new = merge_sort(lis)
print(' '.join(map(str,lis)))

测试总结

冒泡排序、选择排序、插入排序时间复杂度是n^2,快速排序和归并排序时间复杂度nlogn

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
蓝桥杯Python冒泡排序的代码如下: ``` def bubble_sort(words): count = 0 for i in range(len(words)): for j in range(i+1, len(words)): if words[i > words[j]: words[i], words[j = words[j], words[i] count += 1 return count print(bubble_sort(list('onmlkjihgfedcba'))) print(bubble_sort(list('jonmlkihgfedcba'))) ``` 这段代码实现了冒泡排序算法,它会遍历数,每次将相邻的两个元素进行比较,如果前一个元素大于后一个元素,则交换它们的位置。经过一轮遍历后,最大的元素被冒泡到最后。代码中的count变量用来记录交换的次数,最后返回count的值。冒泡排序是一种简单但效率较低的排序算法,它的时间复杂度为O(n^2)。在参考代码中,str1是待排序的字符串,通过将字符串转换成列表lis,然后进行冒泡排序,最后将排序后的列表转换回字符串并输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[蓝桥杯] 排序Python 实现)](https://blog.csdn.net/d_l_w_d_l_w/article/details/122300049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [蓝桥杯-零基础python刷题之路-字符串冒泡排序(包含各个知识点详细记录)](https://blog.csdn.net/m0_37805091/article/details/122619671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值