演算法筆記 7 歸併排序和快速排序(上)

2021-09-30 19:55:35 字數 1622 閱讀 1614

上一部分筆記是時間複雜度為 o(n^2),比較高,適合小規模資料的排序。今天看兩種時間複雜度為 o(nlogn),歸併排序和快速排序。

歸併排序就是乙個典型的分而治之思想的演算法,核心思想:將序列分為前後兩部分,對前後兩部分分別排序,然後合併這兩部分,得到最後結果。

根據歸併的核心思想,我們其實是將排序問題分解為兩個子問題:前半部分排序,後半部分排序。這兩個子問題又進行分解,最後分解為單獨元素之後,進行歸併,這也是排序的過程,最後得到結果。

由於歸併使用分而治之的思想,所以我們使用遞迴的方法來實現**。具體如下:

# 歸併排序

def mergesort(l):

if len(l) <= 1:

return l

else:

return mergesortrecursion(l)

# 遞迴部分,主體部分就是不停的分割合併

def mergesortrecursion(l):

head = 0

tail = len(l) - 1

if len(l) <= 1:

return l

else:

m = int(len(l)/2)

l1 = mergesortrecursion(l[head:m])

l2 = mergesortrecursion(l[m:tail+1])

result = merge(l1,l2)

return result

# 合併函式,進行兩個陣列之間的合併

def merge(l,s):

i = 0

j = 0

result =

while i歸併排序是穩定的排序演算法麼?

穩定取決於 merge 函式的比較,我們**中是小於等於的時候,result 新增 l[i],所以 l 中的元素始終在 s 的元素前邊,所以是穩定的。

歸併排序時間複雜度?

時間複雜度為 o(nlogn),由於歸併排序的執行效率與要排序的原始陣列的有序程度無關,所以時間複雜度很穩定。

快速排序也是分而治之思想的一種典型的演算法。基本思想:在序列中隨意找乙個元素為基準,然後遍歷其他資料,小於的放在左邊,大於的放在右邊。

**實現:

def quick_sort(array, l, r):

if l < r:

q = partition(array, l, r)

quick_sort(array, l, q - 1)

quick_sort(array, q + 1, r)

def partition(array, l, r):

x = array[r]

i = l - 1

for j in range(l, r):

if array[j] <= x:

i += 1

array[i], array[j] = array[j], array[i]

array[i + 1], array[r] = array[r], array[i + 1]

return i + 1

快速排序是一種穩定的、原地排序

快速排序的時間複雜度

快速排序的時間複雜度為 o(nlogn)

演算法筆記 歸併排序 快速排序 計數排序

public static void mergesort int a public static void mergesort int a,int start,int end 取中點 int mid start end start 2 遞迴排序左半部分 mergesort a,start,mid 遞...

排序演算法 7 歸併排序

歸併排序思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。最簡單的 歸併 是直接將兩個有序的子表合併成乙個有序的表。歸併排序 2 路歸併實現 void merge int r,int low,int mid,int high else 將第1段餘下的部分複製到r1 while i mid 將第...

排序演算法7 歸併排序

歸併排序 歸併排序的演算法思想 將兩個或兩個以上的元素有序序列合併為乙個有序序列。其中,二路歸併排序是最常見的歸併排序。演算法思想 二路歸併排序的主要演算法思想是 假設元素個數是n,將每個元素作為乙個有序的子串行。繼續將相鄰的兩個有序子串行兩兩合併得到 示例 假設待排序元素序列為49,23,66,5...