合并排序算法是用分治策略实现对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);