歸併排序是利用先遞迴進行分解,將乙個規模為 n
nn 的問題分解成兩個規模為 n/2
n/2n/
2 的問題,再不斷的繼續進行遞迴分解成最終規模為1
11的問題。然後再逐漸的從小規模結果進行合併,最終得到完整的結果。也即分而治之的思想。
其**如下:原圖位址
歸併排序使用了空間換時間的方式,用乙個輔助陣列來儲存每次排序後的結果,然後再將其複製到原陣列對應的位置上,會將原陣列中對應位置上 的值覆蓋掉。
1、如陣列 [4,3,2,1] 的遞迴子問題為 [4,3] 和 [2,1] 其中先將 [4,3] 的排序結果放在輔助陣列 temp 中(temp的大小為原陣列 arr 的大小)。然後再將在 temp陣列中排好序的結果複製到 arr 陣列中的對應位置上,如下圖所示。遞迴這個過程就是歸併排序。
2、第一次遞迴後的排序結果如下
#include
#include
using
namespace std;
void
merge
(int
*arr,
int*temp,
int left,
int mid,
int right)
else
}while
(i <= mid)
while
(j <= right)
index =0;
while
(left <= right)
arr[left++
]= temp[index++];
}void
mergesort
(int
*arr,
int*temp,
int left,
int right)
}int
main()
;int len =
sizeof
(arr)
/sizeof
(arr[0]
);//建立乙個長度等於原陣列長度的輔助陣列,避免遞迴中頻繁開闢空間
int*temp =
newint
[len]
;mergesort
(arr,temp,
0, len-1)
;delete
temp;
for(
int i =
0; i < len;
++i)
cout << arr[i]
<<
" ";
cout << endl;
system
("pause");
return0;
}
04 歸併排序
歸併排序 顧名思義,就是不斷的將兩個有序的子串行歸併成乙個大的序列。所以核心操作就是有序子列的歸併,如果有兩個子列,共有n個元素,那麼歸併的時間複雜度是t n o n 有了歸併演算法,我們採用易於理解的方式,分而治之的思想,也就是不斷地遞迴將大的序列劃分成小的序列,當序列只有乙個元素的時候 自身有序...
常用排序演算法 歸併排序
歸併排序 基本思想 先把陣列拆分,直到分成都只含有乙個元素的陣列,這樣兩兩合併,逐漸就可以得到已排序的字陣列,繼續合併直到合併成原來陣列長度為止。時間複雜度 o nlogn 空間複雜度 o nlogn 每一輪合併都需要n空間,共需要logn輪 第一輪是1 n 需要n個陣列,每個陣列長度為1 第二輪是...
常用排序演算法 歸併排序
確定分界點 mid l r 2 取中間數,分成 l,mid 和 mid,r 兩個區域。將l l,mid 和 mid,r 兩個區域進行遞迴排序。歸併 將左右兩個有序的序列合併成乙個有序序列。給定你乙個長度為n的整數數列。請你使用歸併排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格...