BAT 經(jīng)典算法筆試題-歸并排序算法
一、算法思想
歸并排序的主要思想是分治法。主要過程是:
1. 將n個元素從中間切開,分成兩部分。
2. 將剩下的數(shù)組通過遞歸的方式一直分割,直到數(shù)組的大小為 1,此時只有一個元素,那么該數(shù)組就是有序的了。
3. 從最底層開始逐步合并兩個排好序的數(shù)列。把兩個數(shù)組大小為1的合并成一個大小為2的有序數(shù)列,再把兩個大小為2有序數(shù)列的合并成4的有序數(shù)列?…?直到全部小的數(shù)組合并起來。
二、思考
那么如何將兩個有序數(shù)列合成一個有序的數(shù)列呢?
我們舉個栗子把,一看就懂啦

。
三、舉個栗子











那么問題來了,難道歸并排序只能排這種有序的數(shù)組么?
四、問題解決

五、算法實現(xiàn)
#include?
void?merge(int?arr[], int?L, int?M, int?R)?{
??int?LEFT_SIZE = M - L;
??int?RIGHT_SIZE = R - M + 1;
??int?left[LEFT_SIZE];
??int?right[RIGHT_SIZE];
??int?i, j, k;
??
??// 填充左邊的數(shù)組
???for?(i=L; i?????left[i-L] = arr[i];
???}
???
??// 填充右邊的數(shù)組
???for?(i=M; i<=R; i++){
?????right[i-M] = arr[i];
???}
???
// for (int i=0; i
// printf("%d\n",left[i]);
// }
//
// for (int i=0; i
// printf("%d\n",right[i]);
// }
??// 合并數(shù)組
???i = 0; j = 0; k = L;
???while?(i < LEFT_SIZE && j < RIGHT_SIZE){
?????if?(left[i] < right[j]){
???????arr[k] = left[i];
???????i++;
???????k++;
?????}else{
???????arr[k] = right[j];
???????j++;
???????k++;
?????}
???}
???
???while(i < LEFT_SIZE){
?????arr[k] = left[i];
?????i++;
?????k++;
???}
???while(j < RIGHT_SIZE){
?????arr[k] = right[j];
?????j++;
?????k++;
???}
???
}
void?mergeSort(int?arr[], int?L, int?R){
??if?(L == R){
????return;
??}else{
????int?M = (L + R) / 2;
????mergeSort(arr,L,M);
????mergeSort(arr, M+1,R);
????merge(arr, L, M+1,R);
??}
}
int?main(){
// int arr[] = {3,7,8,10,2,4,6,9};
??int?arr[] = {8,7,2,10,3,9,4,6};
??int?L = 0;
??int?M = 4;
??int?R = 7;
??mergeSort(arr,L,R);
??
??for?(int?i=0; i<=R; i++){
????printf("%d\n",arr[i]);
??}
}

六、算法分析
七、適用場景

