排序算法(二) 谢尔排序-归并排序-快速排序

本文为学习数据结构与算法Python版的个人笔记

谢尔排序

谢尔排序就是多个子列表的插入排序,
时间复杂度介于 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2)之间

def shellSort(alist):
    gap=len(alist)
    while gap>=1:
        gap=gap//2
        for i in range(gap):
            alist=sub_insertSort(alist,i,gap)
    return alist


def sub_insertSort(alist,startp,gap):
    for i in range(startp,len(alist),gap):
        currentvalue=alist[i]
        position=i
        while position>=gap and alist[position-gap]>currentvalue:
            alist[position]=alist[position-gap]
            position=position-gap
        alist[position]=currentvalue
    return alist

归并排序

思想就是二分法,然后分别排序,然后在一起排序
时间复杂度 O ( n l o g n ) O(nlog_n) O(nlogn)
算法运行过程中需要额外存储空间

def mergeSort(alist):
    if len(alist)<=1:
        return alist
    mid=len(alist)//2
    lefthalf=alist[:mid]
    righthalf=alist[mid:]
    lefthalf=mergeSort(lefthalf)
    righthalf=mergeSort(righthalf)
    merge=[]
    t=0
    i=0
    j=0
    while i0:
        merge=merge+lefthalf[i:]
    else:
        merge=merge+righthalf[j:]
    return merge

# print(mergeSort(alist))

快速排序

时间复杂度 O ( n l o g n ) O(nlog_n) O(nlogn)
思想就是确定一个中值,把数据分成两半,一半比中值小的,一半比中值大的,然后继续继续递归一直到当前数据里只有一个数字。
算法运行过程中不需要额外存储空间

def partsplit(alist,first,last):
    midvalue=alist[first]
    left=first
    right=last
    while left=midvalue and right>first:
            right=right-1
        if left

或者

def fastSort(alist):
    if len(alist)<2:
        return alist
    first=0
    last=len(alist)-1
    midvalue=alist[first]
    left=first
    right=last
    while left=midvalue and right>first:
            right=right-1
        if left

自己实现的时候遇到的一个坑是

 lefthalf=fastSort(alist[:right])
 righthalf=fastSort(alist[right+1:])
 return lefthalf+[alist[right]]+righthalf

这一段,我直接下面这样,不return直接在原alist上也是一个意思,就是没有单独保留中值

lefthalf=fastSort(alist[:right])
righthalf=fastSort(alist[right:])
return lefthalf+righthalf

这样会出现死循环,比如[17,26,20],会一直递归出一个[]和[17,26,20]

你可能感兴趣的:(数据结构)