#include<iostream> using namespace std; void merge(int a[],int left,int mid,int right) { int temp[right-left+1];//注意数组的定义 int left1=left; int right1=mid; int left2=mid+1; int right2=right; int i=0; for(;(left1<=right1)&&(left2<=right2);++i) { if(a[left1]<a[left2]) { temp[i]=a[left1]; left1++; } else { temp[i]=a[left2]; left2++; } } while(left1<=right1) { temp[i++]=a[left1++]; } while(left2<=right2) { temp[i++]=a[left2++]; } for(i=0;i<right-left;++i) a[i+left]=temp[i]; } void sort(int a[],int left,int right) { if(left<right) { int mid=left+(right-left)/2; sort(a,left,mid); sort(a,mid+1,right); merge(a,left,mid,right); } } int main() { int a[]={2,3,5,47,9,45,123}; int j; sort(a,0,6); for(j=0;j<7;++j) cout<<a[j]<<endl; return 0; }
在VS2008下,在merge()函数中temp[right-left+1]定义数组编译不通过,在G++下编译能通过
将数组的定义为以下形式:
int *temp; temp=(int *)malloc(sizeof(int)*(right-left+1));
可以在VS2008中顺利编译成功和正确输出结果。
归并算法的时间复杂度为nlog(n),理解为要递归log(n)次,每一次合并的算法负责度为0(n).空间复杂度为0(n).
还有一种算法空间复杂度为0(1),时间复杂度为0(n^2).过程类似于插入排序
void merge2(int a[],int left,int mid,int right) { int i,j,k,temp; for(i=left,j=mid+1;j<=right;++i) { if(a[i]>a[j]) { temp=a[j]; for(k=j;k>i;--k)a[k]=a[k-1]; a[k]=temp; j++; } } }