【算法】各類排序算法Python簡單實現

 煩躁,看看算法書靜靜心

import numpy as np
import random
import time

# 歸併排序
def sort_two(a,b):
    n = len(a) + len(b)
    a.append(np.inf)
    b.append(np.inf)
    c = []
    for i in range(n):
        if a[0] < b[0]:
            elem = a.pop(0)
        else:
            elem = b.pop(0)
        c.append(elem)
    return c

def MergeSort(li):
    if len(li) <= 1:
        return li
    middle = int(len(li)/2)
    left = MergeSort(li[:middle])
    right = MergeSort(li[middle:])
    return sort_two(left, right)
  

#冒泡排序
def BubbleSort(li):
    for i in range(len(li)-1):
        n = 0
        m = 0
        for i in range(len(li)-1-n):
            if li[m] > li[m+1]:
                li[m], li[m+1] = li[m+1], li[m]
            m += 1
        n += 1
    return li


#插入排序
def InsertSort(li):
    for l in range(len(li)-1):       
        for i in range(l+1):
            if li[l+1-i] > li[l-i]:
                break
            else:
                li[l+1-i], li[l-i] = li[l-i], li[l+1-i]
    return li          


#快速排序
def JudgeRL(li):
    if len(li) <= 1:
        return li   
    right = []
    left = []
    for i in range(len(li)-1):
        if li[i+1] < li[0]:
            left.append(li[i+1])
        else:
            right.append(li[i+1])
    return JudgeRL(left) + [li[0]] + JudgeRL(right)


#計數排序
def CountingSort(li):
    dic = dict(zip(range(max(li)+1),(0 for i in range(max(li)+1))))
    new = []
    for i in li:
        dic[i] += 1
    for i in range(max(li)):
        while dic[i] > 0:
            new.append(i)
            dic[i] -= 1
    return new

    
li = [random.randint(1,10000) for i in range(10000)]
start = time.time()
li_1 = MergeSort(li)
pause = time.time()
li_2 = CountingSort(li)
end = time.time()

print('MergeSort: %f,CountingSort: %f' %(pause - start, end - pause))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章