快排,基数排序,归并排序

快排
选一个元素做基准,将无序区划分为两个。使左边的都比基准小,右边都比基准大。当左右两个区域均为非空时,分别对它们进行划分。
法一(选第一个为基准)
如[49,38,65,97,76,13,27,49]
选49为x。
j从左向右扫描,找到第一个小于x的元素27,j=6,x被a[j]替代[27,38,65,97,76,13,27,49]
i从右向左扫描,找到第一个大于x的元素65,i=2,a[j]被a[i]替代
[27,38,65,97,76,13,65,49]
j向右扫描,找到13,j=5,a[i]被a[j]替代
[27,38,13,97,76,13,65,49]
i从左向右扫描,找到97,i=3,a[j]被a[i]替代
[27,38,13,97,76,97,65,49]
j从右向左扫描,直到i=j,将x赋值给ai
第一次结束 [27,38,13]49[76,97,65,49]
第二次[13]27[ 38] 49[ 49, 65]76[ 97]
第三次
13, 27, 38, 49, 49[ 65]76, 97

def partion (a,l,r):
    i=l
    j=r
    x=a[i]#基准
    while i<j:
        while a[j]>=x and i<j:
        #从右向左扫描,找第一个小于基准的数
            j=j-1
   #若找到

        if i<j: 
            a[i]=a[j]#与其余两个语句共同完成交换的任务
            i=i+1
        while a[i]<=x and i<j:
        #从左向右找第一个大于基准的元素
            i=i+1
            #若找到
        if i<j:
            a[j]=a[i]#与其余两个语句共同完成交换的任务
            j=j-1
    a[i]=x#与其余两个语句共同完成交换的任务
    return i#返回基准的位置
def sort(a,left,right):
    if left <right:#为空或只有一个元素不要排序
        i=partion(a,left,right)#划分
        sort(a,left,i-1)
        sort(a,i+1,right)
    return a

引用块内容

法二(选最后一个元素为基准)
这里写图片描述

数组被分成了三个部分(分别用灰色,黑色,白色表示),其中i和j就是分割线,并且浅灰部分的元素均比A[r]小,黑色部分的元素均比A[r]大

def partion(a,l,r):
    i=l-1
    x=a[r]
    for j in range(l,r-1):
        if  a[j]<=x:
            i=i+1  
            a[j],a[i]=a[i],a[j]
    a[i+1],a[r]=a[r],a[i+1]

    return i+1
def sort(a,left,right):
    if left<right:
        i=partion(a,left,right)
        sort(a,left,i-1)
        sort(a,i+1,right)

基数排序 每个数从个位开始,按位放在0-9九个桶里。 每次结束后合并桶(按之前桶的顺序排列),然后按更高的位再放入不同桶里,再合并。。。

    t=max(a)
    d=len(str(t))#最大数的位数

    for j in range(d):
        s=[[] for q in range(10)]
        for r in a:
            s[r//10**j%10] .append(r)#每个桶分别赋值
        a=[j for i in s for j in i]#桶合并
    return a

归并排序

def merge_sort(nums):
lens = len(nums)
count = lens
n = 2
def sort_two_list(list1,list2):
len1 = len(list1)
len2 = len(list2)
list3 = []
i,j=0,0
while i<len1 and j<len2:
if list1[i] < list2[j]:
list3.append(list1[i])
i += 1
else:
list3.append(list2[j])
j += 1
list3 += list1[i:]
list3 += list2[j:]
return list3
for i in range(0,lens-1,2):/先把相邻两个两两排序
if nums[i] > nums[i+1]:
nums[i],nums[i+1] = nums[i+1],nums[i]
while n<=lens:
list3 = []
for j in range(0,lens,2n):
list3 += sort_two_list(nums[j:j+n],nums[j+n:j+2
n])/每次排好2n个数
nums = list3
n += n
return nums
print(merge_sort([43,23,43,23,34,6]))

注1.当索引的下表超过序列的大小

a=[1,2]
b=a[5:6]
print(b)
python中结果为[ ] 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值