标签: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