172210704111-陈国佳总结《2017年12月11日》【连续062天】
标题:分治思想在归并排序上的应用;
内容:
A.分治的基本概念:
把原任务分成几个(通常为2个)与之形式相同,但规模更小的部分来完成,或只需选一部分完成,然后再处理完成后的结果,实现整个任务的完成;
实例:称假币
16硬币,称假币,假币较轻,最简求法:
8-8称,4-4称,2-2称,1-1称
B.归并排序:
一数组:
1)把前一半排序
2)把后一半排序
3)把两半归并到一个新数组,在拷贝回原数组;
void Merge(int a[],int s,int m,int e,int tmp[])
{ //将数组a的局部a[s,m]和a[m+1,e]合并到tmp中,并保证tmp有序,然后再拷贝回a[s,e]
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){
int m=s+(e-s)/2;
MergeSort(a,s,m,tmp);
MergeSort(a,m+1,e,tmp);
Merge(a,s,m,e,tmp);
}
}
int main()
{
int a[10]={13,27,19,2,8,12,2,8,30,89};
int b[10];
int size=sizeof(a)/sizeof(int);
MergeSort(a,0,size-1,b);
for(int i=0;i<size;++i)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
明日计划:继续学习分治;
本文介绍了分治思想的基本概念及其在归并排序中的应用。通过递归地将数组分为两半进行排序,再合并成一个有序数组,实现整体排序。文章提供了具体的归并排序算法实现代码。
313

被折叠的 条评论
为什么被折叠?



