算法-歸併排序

歸併排序

  • 思路
歸併排序採用的是分治的思想,將一個 n 長度的數組不斷的分成無數個小數組,然後對小數組進行排序,
最後將所以的有序小數組合並,最終數組有序。
  • 算法複雜度

    歸併排序的平均複雜度: O(n) = nlogn, 最壞時間複雜度爲:O(n) = nlogn

  • 算法空間複雜度

    歸併排序的空間複雜度: O(n) = n

python實現

# 遞歸實現
import random
def merge(arr,first,mid,last):
    fore_part = arr[first:mid+1]
    last_part = arr[mid+1:last+1]
    index = first 
    k = 0;
    m = 0;
    while( k <  len(fore_part)):
        while(m < len(last_part)):
            if  fore_part[k] > last_part[m]:
                arr[index] = last_part[m]
                index+=1
                m+=1
            elif fore_part[k] < last_part[m]:
                arr[index] = fore_part[k]
                index+=1
                k+=1
                break;
            else:
                arr[index] = last_part[m]
                arr[index+1] = fore_part[k]
                index+=2
                m+=1
                k+=1
        if ( m >= len(last_part)): 
                arr[index] = fore_part[k]
                index+=1
                k+=1;
    if m < len(last_part):
        for j in range(m,len(last_part)):
            arr[index] = last_part[j]
            index+=1

def merge_sort(arr,first,last):
    mid = int((first+last)/2)
    if first < last:
        merge_sort(arr,first,mid)
        merge_sort(arr,mid+1,last)
        merge(arr,first,mid,last)
    return arr

us = [1,2,0,-1]
us1 = [6,8,0,2,1]
us2 = [9,8,7,6,5,4,3,2,1,0]
print(merge_sort(us,0,len(us)-1))
print(merge_sort(us1,0,len(us1)-1))
print(merge_sort(us2,0,len(us2)-1))

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