排序算法python实现

#冒泡排序
def bubble_sort(lists):
    # 冒泡排序
    #如果i > j就交换 就可以保证i的值是最小的
    count = len(lists)
    for i in range(0, count):
        for j in range(i + 1, count):
            if lists[i] > lists[j]: #注意这里是i 与j 比较 这样就可以把最小的值放到最前面
                lists[i], lists[j] = lists[j], lists[i]
    return lists
def my_bubble_sort():
    #按照c的方法实现 一样的效果
    a = [9, 10, 5, 6, 1, 5, 9, 12, 9, 5]
    len = len(a)
    for i in range(len - 1):
        for j in range(len - i - 1):
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
    print(a)
#快速排序
def quick_sort(list,left,right):  #right=len-1
    if left>=right:
        return list
    key=list[left]
    #这里记得把left right存起来 因为后面会改变其值 而递归调用会用到这个没有改变的值
    low=left
    high=right

    while left<right:
        while left < right and list[right] >= key:   #这里必须加等号 否则会死循环
            right -= 1
        list[left] = list[right]

        while left < right and list[left] <= key:
            left += 1
        list[right] = list[left]
    list[right]=key

    quick_sort(list,low,left-1)
    quick_sort(list,left+1,high)

    return  list
#堆排序的实现  完全按照c++的算法写的
#完成对一个父节点位置的放置 放置为还满足最小堆
def adjust_heap(list,p,len): #p为父节点 len为长度
    lchild=2*p+1   #左孩
    currentp=list[p]   #保存父节点 避免被替换  方便比较
    while lchild<len:
        if lchild+1<len and list[lchild]>list[lchild+1]  :
            lchild+=1
        if currentp>list[lchild]:
            list[p]=list[lchild]
            p=lchild   #更新父节点
            lchild=2*p+1  #更新子节点
        else:
            break   #这个不能省去
    list[p]=currentp  #把父节点放在正确的位置上
    return list
def heap_sort(list,len):
    #初始化堆为最小堆
    for i in range(len//2)[::-1]:  #加这个就可以逆序 从最后一个父节点开始
        list=adjust_heap(list,i,len)
    print(list)
    #交换首尾值   这样得到的序列为逆序 及最小堆 得到的结果是从大到小的排序
    for j in range(len)[::-1]:
        list[0],list[j]=list[j],list[0]
        list=adjust_heap(list,0,j)
    print(list)

#插入排序
def insert_sort(list):
    for i in range(len):
        temp=a[i]
        j=i-1;
        while j>=0:
            if list[j]>temp:
# 每次循环的时候都把j+1 和 j都填充上去,j+1填j  j填temp
#如果不满足temp该放的位置 则下次的时候j会被j-1覆盖掉 直到正确的位置
                list[j+1]=list[j]
                list[j]=temp
            j-=1
    return list

#希尔排序
def shell_sort(list):
    gap=len//2
    while gap>=1:
        for i in range(gap):
            j=i+gap
            while j<len:
                k=j-gap
                key=list[j]
                while k>=0:
                    if list[k]>key:
                        list[k+gap]=list[k]
                        list[k]=key
                    k-=gap
                j+=gap
        gap//=2
    return list

#归并排序
def merge(a,b):  #归并
    i,j=0,0
    c=[]
    while i<len(a) and j<len(b):
        if a[i]<b[j]:
          c.append(a[i]) #这里得用append函数  因为c声明的时候没有声明数量
          i+=1
        else:
          c.append(b[j])
          j+=1
    c+=a[i:]   #把剩余没有比较的加进去
    c+=b[j:]
    return  c
def merge_sort(list):
    if len(list)<=1:   #用来终止递归
        return list

    d=len(list)//2
    a=list[:d]      #不断分为两部分
    b=list[d:]
    a=merge_sort(a)    #递归 并返回结果
    b=merge_sort(b)
    return merge(a,b)

#桶排序 没有采用链表,采用了较多的桶  相同的数放在一个桶中
def bucket_sort(data):
    buckets=[0]*(max(data)-min(data)+1)
    for i in data:
        buckets[i]+=1
    j=0

    for i in range(len(buckets)):
        while buckets[i]!=0:
            data[j] =i
            buckets[i]-=1
            j+=1
    return data

#基数排序  与c++一致 在每一位的排序时用桶排序
#import math  import copy
def radix_sort(data):
    result=[0]*len(data)
    k=math.ceil(math.log(max(data),10))
    for i in range(k):   #循环每一位
        count = [0] * 10   #不要忘记了每次都把count清零  否则会下标越界
        for j in data:   #计数
            d=(j//(10**i))%10
            count[d]+=1
        for j in range(1,10):  #计算位置
            count[j]+=count[j-1]
        for j in data[::-1]:
            d = (j // (10 ** i)) % 10
            result[count[d]-1]=j    #关键的一步   排序
            count[d]-=1
            data=copy.deepcopy(result)  #采用深复制
    return data

#选择排序
def select_sort(data):
    n=len(data)
    for i in range(n):
        p=data[i]
        index=i
        for j in range(i+1,n):
            if(p>data[j]):
                index=j
                p=data[j]
        if index!=i:
            data[i],data[index]=data[index],data[i]
    return data

#计数排序和桶排序一致(和不适用链表的桶排序)

2017-10-16

排序算法的python实现 初版 自己写的 参考的c++ 不太优化




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值