标签:while 数组 for 下标 一个 return eof 合并 std
//归并边界:分治到最后的一半只剩一个值 //复杂度nlgn==2^k * T(n/2^k)+k*a*n当n/2^k==1时算得k得Tn #include<iostream> using namespace std; int a[10]={13,27,19,2,8,12,2,8,30,89}; int b[10];//跟a一样大的数组,用于存放排序过程中的中间结果 void merge(int a[],int s,int m,int e,int tmp[]) { //将要排序的两半合并到tmp中,然后再拷贝到a[s,m]中 //归并的时间复杂度O(e-m+1)==O(N) int pb=0; int p1=s,p2=m+1;//两个指针,分别指向前一半和后一半的开始位置 //归并前两部分都是有序的噢 while(p1<=m&&p2<=e)//都没有走到头 { if(a[p1]<a[p2]) { tmp[pb++]=a[p1++]; } else { tmp[pb++]=a[p2++]; } } while(p1<=m) { tmp[pb++]=a[p1++]; } while(p2<=e) { tmp[pb++]=a[p2++]; } for(int i=0;i<e-s+1;i++) { a[s+i]=tmp[i]; } } void MergeSort(int a[],int s,int e,int tmp[]) { if(s<e)//边界s=e直接返回,此处没写 { int m=s+(e-s)/2;//找中点,前后可能元素个数差一个,无碍 MergeSort(a,s,m,tmp);//前一半归并 MergeSort(a,m+1,e,tmp);//后一半归并 merge(a,s,m,e,tmp);//分别归并后再合并到一起,temp是归并过程中用到额外的存储空间 } } int main() { int size=sizeof(a)/sizeof(int);//算一下多少个元素要排序 MergeSort(a,0,size-1,b);//并不一定排整个数组,可以排连续的一段,参数2-起始下标和参数3-终止下标 for(int i=0;i<size;i++) cout<<a[i]<<","; cout<<endl; return 0; }
标签:while 数组 for 下标 一个 return eof 合并 std
原文地址:http://www.cnblogs.com/dusanlang/p/7603398.html