2.1蓝桥杯——排序

一、冒泡排序

import os
import sys

# 请在此输入您的代码
n=int(input())
m=list(map(int,input().split()))
n=len(m)
#循环n-1次,每次获得i大
for i in range(1,n):
  #每次比较a[j]和a[j+1],从0开始!
  for j in range(0,n-i):
    if m[j]>m[j+1]:
      m[j+1],m[j]=m[j],m[j+1]
print(' '.join(map(str,m)))

二、选择排序 

n=int(input())
m=list(map(int,input().split()))
#循环n-1次
for i in range(n-1):
    #第i次从[i,n-1]找最小值
    min_value=m[i]
    min_index=i
    for j in range(i,n):
        #每个元素都和最小值比较
        if m[j]<min_value:
            min_value=m[j]
            min_index=j
    #将最小值和最前面元素交换
    m[min_index],m[i]=m[i],m[min_index]
print(" ".join(map(str,m)))

 三、插入排序

n=int(input())
m=list(map(int,input().split()))
#对于第i个数字,在区间[0,i-1]中从后往前查找对应插入的位置
for i in range(1,n):
    value=m[i]
    #插入元素下标,当所有元素都大,即最小值插入第一个位置
    insert_idx=0
    for j in range(i-1,-1,-1):
        if m[j]>value:
            #往后挪
            m[j+1]=m[j]
        else:
            insert_idx=j+1
            break;
    m[insert_idx]=value
print(" ".join(map(str,m)))

 四、快速排序

 

def partition(a,left,right):
    """找一个基准值x,然后把数组分成三部分"""
    #基准为a[left]
    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[idx-1],a[left]=a[left],a[idx-1]
    return idx-1
#对a[left,right]进行排序
def quicksort(a,left,right):
    if left<right:
        mid=partition(a,left,right)
        #此时a分成三部分,[left,mid-1],[mid],[mid+1,left]
        quicksort(a,left,mid-1)
        quicksort(a,mid+1,right)
a=[5,3,8,1,2,9,4,7,6]
left=0
right=8
quicksort(a,left,right)
print(a)

五、归并排序

 

def Merge(A,B):
    """
    合并两个有序列表
    :param A:
    :param B:
    :return:返回合并结果
    """
    result=[]
    while len(A)!=0 and len(B)!=0:
        if A[0]<=B[0]:
            result.append(A.pop(0))#弹出A[0]并且添加到结果集
        else:
            result.append(B.pop(0))
    result.extend(A)
    result.extend(B)
    return result
A=[1,3,5,6,7]
B=[2,3,4,9]
print(Merge(A,B))

 

def Merge(A,B):
    """
    合并两个有序列表
    :param A:
    :param B:
    :return:返回合并结果
    """
    result=[]
    while len(A)!=0 and len(B)!=0:
        if A[0]<=B[0]:
            result.append(A.pop(0))#弹出A[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)
n=int(input())
a=list(map(int,input().split()))
print(" ".join(map(str,MergeSort(a))))

 

六、桶排序 


def Bucket_Sort(a,bucketcount):
    """

    :param a: 排序列表
    :param bucketcount: 桶的数量
    :return:
    """
    minvalue,maxvalue=min(a),max(a)
    #桶大小:每个桶的元素范围
    bucketsize=(maxvalue-minvalue+1)//bucketcount
    res=[[] for i in range(bucketcount+1)]
    #把所有元素放到对应桶中
    for x in a:
        #元素放在第几个桶
        idx=(x-minvalue)//bucketsize
        res[idx].append(x)
    print(res)
    #每个桶单独排序
    ans=[]
    for res_x in res:
        res_x.sort()
        ans+=res_x
    return ans
n=int(input())
a=list(map(int,input().split()))
a=Bucket_Sort(a,min(n,1000))
print(" ".join(map(str,a)))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值