合併排序算法是用分治策略實現對n個元素進行排序的算法。
基本思想:將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合。
歸併操作的工作原理如下:第一步:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
第二步:設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
重複步驟3直到某一指針超出序列尾
將另一序列剩下的所有元素直接複製到合併序列尾
#include <iostream>
#include <string.h>
using namespace std;
//合併算法
void Merge(int a[],int left,int middle,int right)//0 3 7 4+4
{
int lsize=middle-left+1,rsize=right-middle;
int la[lsize],ra[rsize];
memcpy(la,a+left,sizeof(int)*lsize);
memcpy(ra,a+middle+1,sizeof(int)*rsize);
int i=0,j=0,k=left;
while(i<lsize&&j<rsize)
{
if(la[i]<ra[j])
{
a[k++]=la[i++];
}
else a[k++]=ra[j++];
}
while(i<lsize)a[k++]=la[i++];
while(j<rsize)a[k++]=ra[j++];
delete la;
delete ra;
}
void MergeSort(int num[],int left,int right)//遞歸合併排序
{
if(left>=right)return;
int middle = (left+right)/2;
MergeSort(num,left,middle);
MergeSort(num,middle+1,right);
Merge(num,left,middle,right);
}
int main()
{
int num[] = {5,1,9,10,2,18,6,0};
MergeSort(num,0,7);
for(int i=0;i<8;i++)
cout<<num[i]<<" ";
}
/*
1 3 6 4 9 2 0
1 3 4 6 2 9 0
1 3 4 6 0 2 9
*/
複雜性分析:最壞情況下,每次執行合併操作耗費O(n)時間,共需要遞歸O(logn)次,所以最壞情況下時間複雜性爲O(nlogn);