python 實現插入排序、冒泡排序、歸併排序

 def InsertSort(A):
    '''插入排序算法:傳入一個數組,對數組進行排序'''
    print('排序前的順序:',A)
    length=len(A)
    for i  in range(1,length):#從第二個開始
        key=A[i]
        j=i-1
        while j>=0 and A[j]>key:
            A[j+1]=A[j]
            j=j-1
            A[j+1]=key
    print('排序後的順序:',A)
 	#插入排序時間複雜度:n^2,空間複雜度:1,相同元素保持相對不變性(相對位置不變)
 
if __name__=='__main__':
    listA=[1,5,7,3,4,6,7,8,9,9,15,10,4]
    InsertSort(listA)
def BableSort(A):
    '''冒泡排序算法:對數組進行排序'''
    print('冒泡排序前的順序:',A)
    length=len(A)
    for i in range(1,length):
        #rang=range(i)
        #for j in reversed(rang):
        for j in range(i,0,-1): #range逆序遍歷
            if A[j-1]> A[j]:
                temp=A[j]
                A[j]=A[j-1]
                A[j-1]=temp
 
    print('冒泡排序後的順序:',A)
    
# 冒泡排序時間複雜度爲:n^2,空間複雜度1,相同元素保持相對不變性
if __name__=='__main__':
     listA=[1,5,7,3,4,6,7,8,9,9,15,10,4]
     BableSort(listA)
# 歸併排序,對數組進行排序
def MergeSort(alist):
    print("Splitting ",alist)
    if len(alist)>1:
        mid = len(alist)//2#精確除法,取小於等於結果的最大整數,相當於對結果進行向下取整
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        MergeSort(lefthalf)#遞歸調用左半部分
        MergeSort(righthalf)#遞歸調用右半部分
 
        #合併過程
        i=0
        j=0
        k=0
        while i < len(lefthalf) and j < len(righthalf):
            if lefthalf[i] < righthalf[j]:
                alist[k]=lefthalf[i]
                i=i+1
            else:
                alist[k]=righthalf[j]
                j=j+1
            k=k+1
 
        while i < len(lefthalf):
            alist[k]=lefthalf[i]
            i=i+1
            k=k+1
 
        while j < len(righthalf):
            alist[k]=righthalf[j]
            j=j+1
            k=k+1
    print("Merging ",alist)
     # 歸併排序算法時間複雜度:n*lgn,空間複雜度:n,相同元素保持順序不變性
     
if __name__=='__main__':
    listA=[1,5,7,3,4,6,7,8,9,9,15,10,4]
    MergeSort(listA)

mergesortA       mergesortB

 

參考:http://interactivepython.org/courselib/static/pythonds/SortSearch/TheMergeSort.html

發佈了59 篇原創文章 · 獲贊 61 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章