1. 程式人生 > >排序演算法(python實現)

排序演算法(python實現)

排序演算法一共有2類:

   演算法時間fuzh複雜讀與nlogn比較,大為非線性類,小為線性類;

        非線性類比較類排序有:交換排序(冒泡,快速),插入排序(簡單插入,shell),歸併排序(2路歸併,多路歸併),選擇排序(簡單選擇,堆排序);

        線性時間非比較類排序有:基數排序,計數排序,還有桶排序。


import copy

#插入排序
def insert_sort(ilist):
    for i in range(len(ilist)):
        for j in range(i):
            if ilist[i] < ilist[j]:
                ilist.insert(j, ilist.pop(i))
                break
    return ilist

#shell排序
def shell_sort(slist):
    gap = len(slist)
    while gap > 1:
        gap = gap // 2
        for i in range(gap, len(slist)):
            for j in range(i % gap, i, gap):
                if slist[i] < slist[j]:
                    slist[i], slist[j] = slist[j], slist[i]
    return slist

#氣泡排序
def bubble_sort(blist):
    count = len(blist)
    for i in range(0, count):
        for j in range(i + 1, count):
            if blist[i] > blist[j]:
                blist[i], blist[j] = blist[j], blist[i]
    return blist

#快速排序
def quick_sort(qlist):
    if qlist == []:
        return []
    else:
        qfirst = qlist[0]
        qless = quick_sort([l for l in qlist[1:] if l < qfirst])
        qmore = quick_sort([m for m in qlist[1:] if m >= qfirst])
        return qless + [qfirst] + qmore
    
#選擇排序
def select_sort(slist):
    for i in range(len(slist)):
        x = i
        for j in range(i, len(slist)):
            if slist[j] < slist[x]:
                x = j
        slist[i], slist[x] = slist[x], slist[i]
    return slist


 #堆排序
def heap_sort(hlist):
    def heap_adjust(parent):
        child = 2 * parent + 1  # left child
        while child < len(heap):
            if child + 1 < len(heap):
                if heap[child + 1] > heap[child]:
                    child += 1  # right child
            if heap[parent] >= heap[child]:
                break
            heap[parent], heap[child] = heap[child], heap[parent]
            parent, child = child, 2 * child + 1
 
    heap, hlist = copy.copy(hlist), []
    for i in range(len(heap) // 2, -1, -1):
        heap_adjust(i)
    while len(heap) != 0:
        heap[0], heap[-1] = heap[-1], heap[0]
        hlist.insert(0, heap.pop())
        heap_adjust(0)
    return hlist

#基數排序
def radix_sort(array):
    bucket, digit = [[]], 0
    while len(bucket[0]) != len(array):
        bucket = [[], [], [], [], [], [], [], [], [], []]
        for i in range(len(array)):
            num = (array[i] // 10 ** digit) % 10
            bucket[num].append(array[i])
        array.clear()
        for i in range(len(bucket)):
            array += bucket[i]
        digit += 1
    return array


#歸併排序
def merge_sort(array):
    def merge_arr(arr_l, arr_r):
        array = []
        while len(arr_l) and len(arr_r):
            if arr_l[0] <= arr_r[0]:
                array.append(arr_l.pop(0))
            elif arr_l[0] > arr_r[0]:
                array.append(arr_r.pop(0))
        if len(arr_l) != 0:
            array += arr_l
        elif len(arr_r) != 0:
            array += arr_r
        return array
 
    def recursive(array):
        if len(array) == 1:
            return array
        mid = len(array) // 2
        arr_l = recursive(array[:mid])
        arr_r = recursive(array[mid:])
        return merge_arr(arr_l, arr_r)
 
    return recursive(array)

def main():
    
     print("!!!!!!!!!!!!!!!!歡迎進入楊遠林的排序世界!!!!!!!!!!!!!!!!")
     print("1(氣泡排序)!")
     print("2(快速排序)!")
     print ("3(插入排序)!")
     print("4(shell排序)!")
     print("5(簡單選擇排序)!")
     print("6(堆排序)!")
     print("7(2路歸併排序)!")
     print("8(多路歸併排序)!")
     a=[4,5,6,7,3,2,6,9,8]
     print("原來陣列為!",a)
     a=int(input("請輸入資料選擇:"))
     i=1
     while(i==1):
         
         
         if(a==1):
             
             blist = bubble_sort([4,5,6,7,3,2,6,9,8])
             print(blist)
             break
         
         elif(a==2):
             qlist = quick_sort(a)
             print(qlist)
             break
         elif(a==3):
             
             ilist = insert_sort([4,5,6,7,3,2,6,9,8])
             print(ilist)
             break
         elif(a==4):
             slist = shell_sort([4,5,6,7,3,2,6,9,8])
             print(slist)
             break
         elif(a==5):
             slist = select_sort([4,5,6,7,3,2,6,9,8])
             print(slist)
             break
         elif(a==6):
             hlist = heap_sort([4,5,6,7,3,2,6,9,8])
             print(hlist)
             break
         elif(a==7):
             rlist=radix_sort([4,5,6,7,3,2,6,9,8])
             print(rlist)
             break
         elif(a==8):
              glist = merge_sort([4,5,6,7,3,2,6,9,8])
              print(glist)
              break
         elif(a==0):
              
             break
         else :
             print("輸入不合法。重新輸入!")
             a=int(input("請輸入資料選擇:"))
             continue
        
                
main()