問題描述
給定乙個數列,用歸併排序演算法把它排成公升序
輸入格式
第一行是乙個整數n(n不大於10000),表示要排序的數的個數;
下面一行是用空格隔開的n個整數。
輸出格式
輸出排序後的數列,每個數字佔一行。
樣例輸入
53 2 1 4 5
樣例輸出12
345思路:
寫出歸併排序的核心**。歸併排序**是典型的分治法,分而治之。
拆分:merge函式,傳遞引數(陣列、長度),採用二分法,左邊為list1,右邊為list2,*list1指向第乙個陣列元素,*list2指向第二個陣列元素,運用遞迴多次拆分直至單個元素。
合併:mergeing 函式,傳遞引數(*list1,*list2,list1長度,list2長度),判斷元素大小,從小到大排序所以將小元素放入臨時陣列中,迴圈放入,如果最後陣列中還有剩餘元素,全部放入臨時陣列中,最後將臨時陣列賦值給陣列1
具體**
# include
# define n 1000
//歸併排序核心
//合併
void mergeing (
int* list1,
int list1_size,
int* list2,
int list2_size)
while
(itemp[k++
]=list1[i++];
while
(jtemp[k++
]=list2[j++];
for(z=
0;z<
(list1_size+list2_size)
;z++
) list1[z]
=temp[z];}
//分離
void merge (
int a,
int n)
}int
main()
merge
(b,a)
;for
(i=0
;i)return0;
}
1002 歸併排序
題目 分析 歸併排序思想是分治法,首先運用遞迴讓序列左半部分有序,再使右半部分有序。最後 把這兩部分按大小進行歸併,合成乙個序列。include includevoid merge int a,int start,int mid,int end void mergesort int a,int st...
NOJ1002 演算法實驗一 歸併排序
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述給定乙個數列,用歸併排序演算法把它排成公升序。輸入第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出輸出排序後的數列,每個數字佔一行。輸入樣例 53 2 1 4 5 輸出樣例12 ...
遞迴分治篇 歸併排序NOJ1002
時限 1000ms 記憶體限制 10000k 總時限 3000ms 給定乙個數列,用歸併排序演算法把它排成公升序。第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出排序後的數列,每個數字佔一行。二路歸併 自底向上 自頂向下 為什麼覺得自頂向下就是比自底...