分治法--用C++实现合并排序
来源:互联网 发布:淘宝动态图制作方法 编辑:程序博客网 时间:2024/06/10 20:40
转自:http://c.chinaitlab.com/cc/example/200909/793114.html
合并排序的思想:当只有一个元素时终止排序,超过一个元素的话,将所有元素分成大致相同的两个集合,分别对两个集合进行排序,最后将排好序的子集合合并为所要求的排好序的集合。
在最坏情况下,时间复杂度为O(nlogn),它是一个渐进的最优算法。
#include <iomanip.h>
#include <iostream.h>
//这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]
template <class T>
void Copy(T a[],T b[],int left,int right)
{
int size=right-left+1;
for(int i=0;i<size;i++)
{
a[left++]=b[i];
}
}
//这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
template <class T>
void Merge(T a[],T b[],int left,int i,int right)
{
int a1cout=left,//指向第一个数组开头
a1end=i,//指向第一个数组结尾
a2cout=i+1,//指向第二个数组开头
a2end=right,//指向第二个数组结尾
bcout=0;//指向b中的元素
for(int j=0;j<right-left+1;j++)//执行right-left+1次循环
{
if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到b
if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到b
if(a[a1cout]<a[a2cout]){b[bcout++]=a[a1cout++];continue;}//如果两个数组都没结束,比较元素大小,把较小的放入b
else
{b[bcout++]=a[a2cout++];continue;}
}
}
//对数组a[left:right]进行合并排序
template <class T>
void MergeSort(T a[],int left,int right)
{
T *b=new int[right-left+1];
if(left<right){
int i=(left+right)/2;//取中点
MergeSort(a,left,i);//左半边进行合并排序
MergeSort(a,i+1,right);//右半边进行合并排序
Merge(a,b,left,i,right);//左右合并到b中
Copy(a,b,left,right);//从b拷贝回来
}
}
//from http://hi.baidu.com/zhangamxqun
int main()
{
int n;
cout<<"how many numbers to sort:";
cin>>n;
int *a=new int[n];
cout<<"input "<<n<<" numbers:";
for(int i=0;i<n;i++)
{cin>>a[i];}
MergeSort( a, 0, n-1);
for(int j=0;j<n;j++)
{
cout<<setw(5)<<a[j];
}
return 1;
}
- 分治法--用C++实现合并排序
- 分治法之合并排序(C实现)
- 分治法合并排序(C++)
- 用C语言实现分治法排序
- 分治法合并排序
- 分治法--合并排序
- 分治法合并排序
- 分治法-----合并排序
- 分治法--合并排序
- 算法之合并排序【分治法】【C语言】
- 合并排序(分治法)
- 合并排序与分治法
- 分治法(合并排序)
- 排序3--合并(分治法)
- 分治法 合并排序递归
- 算法导论-分治法-合并排序的Python&C++实现
- 算法中分治策略实现合并排序
- 分治:合并排序的java程序实现
- oracle数据库删除数据Delete语句和Truncate语句的对比
- 试图运行项目时出错:未能加载文件或程序集 或它的某一个依赖项。该模块应包含一个程序集清单 .
- JNI编程
- Wireless Channel划分
- O(logn)时间复杂度求Fibonacci数列
- 分治法--用C++实现合并排序
- yii 屏蔽错误提示
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
- 自动kill掉超时的mysql show processlist进程
- 浅谈动态规划法与贪心法和回溯法的联系
- python语言中,对于cursor的查询明明有结果,为什么print cursor.rowcount结果为-1?
- Spring 定时器的时间设置规则
- php判断str是否是xml格式
- /usr/local/php/bin/phpize 时出错 : warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must