排序算法python实现

来源:互联网 发布:弹幕视频网站源码 编辑:程序博客网 时间:2024/05/16 03:18

#冒泡排序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 listsdef 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 listdef 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  cdef 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 copydef 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++ 不太优化