程式語言:c
編譯環境:gcc
作業系統:linux
演算法分析:對於連個已將排序ok的陣列,想把他們合併一起並依照有序的排放,那麼就以公升序為例。假設連個待排序陣列都為公升序和乙個待排序陣列空間,第一次比較,先從兩個陣列的首位分別獲取兩個值比較這兩個值,然後然較小的值放入待排序陣列空間的首位;第二次比較,對於首位元素已經放入待排序陣列空間的陣列,那麼就拿出陣列的第二元素與另乙個陣列進行比較首位進行比較,還是較小的元素放入待排序陣列空間的第二位。那麼第三次、第四次以此類推,注意終止條件如果乙個陣列中先沒有元素則進行標記不進行比較。
#include
/* * @brief 將兩個已將排序好的陣列合併為乙個公升序陣列
* @param len1: 第乙個陣列長度
* @param len2: 第二個陣列長度
* @note: 第三個陣列的長度應大於等於前兩個陣列的長度總和,否者將會導致記憶體洩漏。前兩個陣列均為序
* @retval 無
* */
void
ascending_merge_sort
(int
*arr1,
int len1,
int*arr2,
int len2,
int*arr3)
while
(arr3_len--
>=0)
//將合併後的臨時陣列拷貝到陣列3中
arr3[arr3_len]
= merge_arr[arr3_len];}
/* * @brief 將兩個已將排序好的陣列合併為乙個降序陣列
* @param len1: 第乙個陣列長度
* @param len2: 第二個陣列長度
* @note: 第三個陣列的長度應大於等於前兩個陣列的長度總和,否者將會導致記憶體洩漏。前兩個陣列均為序
* @retval 無
* */
void
descending_merge_sort
(int
*arr1,
int len1,
int*arr2,
int len2,
int*arr3)
while
(arr3_len--
>=0)
//將合併後的臨時陣列拷貝到陣列3中
arr3[arr3_len]
= merge_arr[arr3_len];}
/* * @brief 單行輸出陣列所有元素中間用空格隔開
* @param len:輸出陣列的長度
* @note 沒有使用換行輸出
* @retval 無
* */
void
print_array
(int
*a,int len)
intmain()
;int arr2[5]
=;int arr3[10]
=;printf
("原陣列為:\n");
print_array
(arr1,5)
;print_array
(arr2,5)
;printf
("採用公升序合併排序,合併後的陣列為:\n");
ascending_merge_sort
(arr1,
5, arr2,
5, arr3)
;print_array
(arr3,10)
;printf
("採用降序合併排序,合併後的陣列為:\n");
descending_merge_sort
(arr1,
5, arr2,
5, arr3)
;print_array
(arr3,10)
;return0;
}
執行結果
原陣列為:13
4580
2679
採用公升序合併排序,合併後的陣列為:01
2345
6789
採用降序合併排序,合併後的陣列為:98
7654
3210
歸併排序(合併排序)
題目 要求氣泡排序的交換次數,也就是求逆序數的個數。在乙個排列中如果有兩個數的排序和所規定的排序規則相反,則這兩個數是乙個逆序。乙個排列中的逆序的總數就是這個排列的逆序數。用歸併排序,求逆序數的個數。poj 2299 這道題充分印證了,即使merge本身可能用的不多,但分冶的思想卻是無所不在 inc...
歸併排序(合併排序)
合併排序 merge sort 是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又n個有序的子串行組成,每個子串行的長度為1,然後再兩兩合併,得到了乙個 n 2 個長度為2...
排序 合併排序
與很多有用的演算法類似,合併排序基於這樣乙個技巧 將 2 個大小為 n 2 的已排序序列合併為乙個 n 元素已排序序列僅需要 n 次操作。這個方法叫做合併。我們用個簡單的例子來看看這是什麼意思 通過此圖你可以看到,在 2 個 4元素序列裡你只需要迭代一次,就能構建最終的8元素已排序序列,因為兩個4元...