排序演算法中 歸併排序和快速排序

2021-09-24 08:52:18 字數 1831 閱讀 1081

氣泡排序、插入排序、選擇排序這三種演算法的時間複雜度都為分治思想,非常巧妙。

1.1. 歸併排序演算法實現

遞推公式:

merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))

終止條件:

p >= r 不用再繼續分解

複製**

// o(n(logn))

void

merge_sort

(float data, int left, int right, float sorted_data)

}void

merge_array

(float data, int left, int mid, int right, float temp)

else

}// 判斷哪個子陣列還有元素,並拷貝到 temp 後面

while(i <= mid)

while(j <= right)

// 將 temp 中的資料拷貝到原陣列對應位置

for(i = 0; i < k; i++)

}複製**

1.2. 歸併排序演算法分析

$$ = 2*[2*t(\frac) + \frac] + n = 4*t(\frac) + 2*n $$

$$ = 4*[2*t(\frac) + \frac] + 2*n = 8*t(\frac) + 3*n $$

$$ ......$$

$$ = 2^k * t(\frac) + k * n$$

$$ ......$$

複製**

用大 o 標記法來表示,歸併排序的時間複雜度為

1.1. 快速排序演算法實現

遞推公式:

quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1, r)

終止條件:

p >= r

複製**

// o(n(logn))

void

quick_sort

(float data, int left, int right)

}data[j] = data[i];

data[i] = pivot;

quick_sort(data, left, i-1);

quick_sort(data, i+1, right);

}}複製**

// o(n(logn))

void

quick_sort

(float data, int left, int right)

if(i < j)

while(i < j && data[j] >= pivot) // 從右往左找到第乙個比 pivot 小的數

if(i < j)

}data[i] = pivot; // i=j

quick_sort(data, left, i-1);

quick_sort(data, i+1, right);

}}複製**

2.2. 快速排序演算法分析

參考資料-極客時間專欄《資料結構與演算法之美》

排序 歸併排序和快速排序

1,歸併排序的基本思想 1,將兩個或兩個以上的有序序列合併成乙個新的有序序列,比如有序序列 v 0 v m 和 v m 1 v n 1 合併為 v 0 v n 1 這種歸併方法稱為 2 路歸併 1,必須大於 1 個有序序列 2,必須有序 2,歸併的套路 1,將 3 個有序序列歸併為乙個新的有序序列,...

歸併排序和快速排序

歸併排序 先將問題分解為小問題即乙個個子序列,再將子串行按順序合併。class mergesort mergesort a,0 a.length 1 for int t a public static void mergesort int a,int m,int n public static vo...

歸併排序和快速排序

歸併排序的陣列排序任務可以如下完成 1 把前一半排序 2 把後一半排序 3 把兩半歸併到乙個新的有序陣列,然後再拷貝回原陣列,排序完成。include using namespace std void merge int a,int s,int m,int e,int tmp while p1 m ...