美文网首页
【算法】常用的排序算法的Python实现

【算法】常用的排序算法的Python实现

作者: 账号已删除 | 来源:发表于2018-03-12 02:02 被阅读34次

jupyter notebook 导出的
包括:插入排序/希尔排序;冒泡排序/快速排序;简单选择排序/堆排序;归并排序

xixi=[1,3,5,7,9,2,4,6,8,10]
#插入排序;空间O(1);时间O(n^2)
def insert_sort(lst):
    lst=lst[:]#避免替换
    for i in range(1,len(lst)):
        temp=lst[i]
        j=i
        while j>0 and lst[j-1]>temp:#寻找插入点
            lst[j]=lst[j-1]
            j-=1
        lst[j]=temp
    return lst
print(insert_sort(xixi))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#希尔排序:O(1);O(nlogn)~O(n^2)
def shell_sort(lst):
    lst=lst[:]#避免覆盖
    num=step=len(lst)
    while True:
        step=step//3+1
        for i in range(step,num):#除跳跃外,与插入一致
            temp=lst[i]
            j=i
            while j>0 and lst[j-step]>temp:#跳跃寻找插入点
                lst[j]=lst[j-step]
                j-=step
            lst[j]=temp
        if step<=1:
            break
    return lst
shell_sort(xixi)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#冒泡排序/交换排序;空间O(1),时间O(n^2)
def bubble_sort(lst):
    lst=lst[:]#避免替换
    for i in range(len(lst)-1):#n-1次循环
        for j in range(1,len(lst)-i):#每一轮后最大的在最后面
            if lst[j-1]>lst[j]:
                lst[j-1],lst[j]=lst[j],lst[j-1]
    return lst
print(insert_sort(xixi))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#快速排序;O(nlogn)~O(n);O(nlogn)
def quick_sort(lst):
    lst=lst[:]#避免替换
    qsort_rec(lst,0,len(lst)-1)
    return lst

def qsort_rec(lst,left,right):
#     print(lst,left,right)
    if left>=right:
        return
    i=left
    j=right
    pivot=lst[i]
    while i<j:
        while i<j and lst[j]>=pivot:#j向左扫描,找小于pivot的记录
            j-=1
        lst[i]=lst[j]
        while i<j and lst[i]<=pivot:#i向右扫描,找大于pivot的记录
            i+=1
        lst[j]=lst[i]
    lst[i]=pivot
    qsort_rec(lst,left,i-1)#排序左侧
    qsort_rec(lst,i+1,right)#排序右侧
print(quick_sort(xixi))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#简单选择排序;空间O(1);时间O(n^2)
def select_srot(lst):
    lst=lst[:]#避免替换
    for i in range(len(lst)-1):
        k=i
        for j in range(i,len(lst)):#查找最小位置
            if lst[j]<lst[k]:
                k=j
        if i!=k:
            lst[i],lst[k]=lst[k],lst[i]
    return lst
print(insert_sort(xixi))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#堆排序;O(1),O(nlogn)
def heap_sort(lst):
    lst=lst[:]#避免覆盖
    num=len(lst)
    #搭建大顶堆
    for i in range(0,num//2)[::-1]:
        heap_adjust(lst,i,num)
    #堆顶记录与最后一个记录交换
    for i in range(0,num)[::-1]:
        lst[0],lst[i]=lst[i],lst[0]
        heap_adjust(lst,0,i)
    return lst

def heap_adjust(lst,i,size):
    left=2*i+1
    right=2*i+2
    max=i
    if i<size//2:
        if left<size and lst[left]>lst[max]:
            max=left
        if right<size and lst[right]>lst[max]:
            max=right
        if max!=i:
            lst[max],lst[i]=lst[i],lst[max]#实现本级交换
            heap_adjust(lst,max,size)#调整交换后的子结点
                       
heap_sort(xixi)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#归并排序;O(n);O(nlogn)
def merge_sort(lst):
    if len(lst)<=1:
        return lst
    num=len(lst)//2
    left=merge_sort(lst[:num])
    right=merge_sort(lst[num:])
    return merge(left,right)

def merge(left,right):
    i,j=0,0
    result=[]
    while i<len(left) and j<len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i+=1
        else:
            result.append(right[j])
            j+=1
    result+=left[i:]
    result+=right[j:]
    return result

merge_sort(xixi)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
xixi
[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

随手补个煎饼排序,挺有趣的

xixi=[2,4,6,8,10,1,3,5,7,9]
def pancake_sort(lst):
    lst=lst[:]
    for i in range(len(lst))[::-1]:
        #找到最大的那个
        # maxIndex=0
        # for j in range(1,i+1):
        #     if lst[j]>lst[maxIndex]:
        #         maxIndex=j
        #求最大的位置
        maxIndex=lst[:i+1].index(max(lst[:i+1]))
        #翻面一次
        lst=lst[:maxIndex+1][::-1]+lst[maxIndex+1:]
        #翻面二次
        lst=lst[:i+1][::-1]+lst[i+1:]
    return lst
print(pancake_sort(xixi))

相关文章

网友评论

      本文标题:【算法】常用的排序算法的Python实现

      本文链接:https://www.haomeiwen.com/subject/ogqgfftx.html