归并的两种方法
2017-11-20 21:06
106 查看
void Merge(int* data,int* tmp,int left,int right,int rightend)
{
int leftend = right-1;
int size = rightend-left+1;
int cnt = left;
while(left <= leftend && right <= rightend){
if(data[left] < data[right]){
tmp[cnt++] = data[left++];
}else{
tmp[cnt++] = data[right++];
}
}
while(left <= leftend){
tmp[cnt++] = data[left++];
}
while(right <= rightend){
tmp[cnt++] = data[right++];
}
for(int i =0 ; i <size ; i++,rightend--){
data[rightend] = tmp[rightend];
}
}
//归并排序
void Msort(int* data,int* tmp,int left,int rightend)
{
if(left < rightend){
int mid = (left+rightend)/2;
Msort(data,tmp,left,mid);
Msort(data,tmp,mid+1,rightend);
Merge(data,tmp,left,mid+1,rightend);
}
}
//归并排序(递归版本)
void Merge_Sort(int* data,intsize)
{
int* tmp = new int[size];
if(tmp != NULL){
Msort(data,tmp,0,size-1);
}
简化之后,第二种:
int a[100010],b[100010],n;//定义全局变量
long long s;
void ssort(int sta,int end)
{
if(end-sta<=1)
return;
int m=(sta+end)/2;
ssort(sta,m);
ssort(m,end);
int i,j,k;
i=sta;
j=m;
k=sta;
while(i<m||j<end)
{
if(j>=end||(i<m&&a[i]<=a[j]))
b[k++]=a[i++];
else
{
if(i<m)
s=s+m-i;
b[k++]=a[j++];
}
}
for(i=sta;i<end;i++)
a[i]=b[i];
//int mum=0; mum++;
}
{
int leftend = right-1;
int size = rightend-left+1;
int cnt = left;
while(left <= leftend && right <= rightend){
if(data[left] < data[right]){
tmp[cnt++] = data[left++];
}else{
tmp[cnt++] = data[right++];
}
}
while(left <= leftend){
tmp[cnt++] = data[left++];
}
while(right <= rightend){
tmp[cnt++] = data[right++];
}
for(int i =0 ; i <size ; i++,rightend--){
data[rightend] = tmp[rightend];
}
}
//归并排序
void Msort(int* data,int* tmp,int left,int rightend)
{
if(left < rightend){
int mid = (left+rightend)/2;
Msort(data,tmp,left,mid);
Msort(data,tmp,mid+1,rightend);
Merge(data,tmp,left,mid+1,rightend);
}
}
//归并排序(递归版本)
void Merge_Sort(int* data,intsize)
{
int* tmp = new int[size];
if(tmp != NULL){
Msort(data,tmp,0,size-1);
}
简化之后,第二种:
int a[100010],b[100010],n;//定义全局变量
long long s;
void ssort(int sta,int end)
{
if(end-sta<=1)
return;
int m=(sta+end)/2;
ssort(sta,m);
ssort(m,end);
int i,j,k;
i=sta;
j=m;
k=sta;
while(i<m||j<end)
{
if(j>=end||(i<m&&a[i]<=a[j]))
b[k++]=a[i++];
else
{
if(i<m)
s=s+m-i;
b[k++]=a[j++];
}
}
for(i=sta;i<end;i++)
a[i]=b[i];
//int mum=0; mum++;
}
相关文章推荐
- 计算逆序数:在归并和快排两种排序过程中求得逆序数的方法比较
- 归并排序--自上而下和自下而上两种方法的实现
- js数组的五种迭代方法及两种归并方法(推荐)
- unity在android显示界面(UnityPlayerActivity)不重复加载且app退出杀掉所有界面的两种方法
- 调用数据连接两种方法
- 【堆/排序】堆排序的两种建堆方法
- 一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递规和非递归两种方法算法实现
- cocos2d-x + lua获取CocoStudio中导入json文件中控件的两种方法:
- Broadcast Receiver的两种注册方法
- 程序员面试100题(算法)之整数的二进制表示中1的个数(两种方法)
- LINUX下安装ORACLE时SWAP不足的两种解决方法
- matlab画平滑曲线的两种方法
- Java动态代理的两种实现方法
- 数据归一化和两种常用的归一化方法
- iframs刷新的两种方法
- checkbox无法立即实现onchange的两种替代方法(onchange和onpropertychange的区别)
- Java实现掷骰子控制台和窗体两种实现方法
- 算法 2.2节 两种归并算法及其改进
- SQL Server 批量插入数据的两种方法
- 【面试】实现页面跳转的两种方法