| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1608 人关注过本帖
标题:对两个数组同时进行归并排序时出错
只看楼主 加入收藏
zyuanlin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-5-1
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:2 
对两个数组同时进行归并排序时出错
求助      对两个数组同时进行归并排序时出错(实际只对一个数组进行排序,另一个数组只是下标与进行排序的那个数组进行同步变化)
            **下面是仅对一个数组排序时的代码:*
#include <iostream>
using namespace std;
void merge(int *A,int low,int high,int mid){
    int length = (high-low+1);
    int i=low;
    int j=mid+1;
    int k1[length],k2[length];
    int m = 0;
    while(i<=mid&&j<=high){
        if(A[i]<=A[j]){
            k1[m++] = A[i++];
            
        }else{
            k1[m++] = A[j++];
            
        }
    }
    while(i<=mid){
        k1[m++] = A[i++];
        
    }
    while(j<=high){
        k1[m++] = A[j++];
        
    }
    for(int p=0;p<m;p++){
        A[low+p] = k1[p];
        
    }
}

void mergeSort(int *A,int low,int high){
    if(high>low){
        int mid=(low+high)/2;
        mergeSort(A,low,mid);
        mergeSort(A,mid+1,high);
        merge(A,low,high,mid);
    }
    else return;
}



int main()
{
   
    int n;
    cout<<"请输入数据:"<<endl;
    cin>>n;
    int A[n];
    int a,b,flag=0,max,maxi;
    for(int i=0;i<n;i++)   cin>>A[i];
    mergeSort(A,0,n-1);
    cout<<"输出结果"<<endl;
    for(int i=0;i<n;i++)   cout<<A[i]<<" ";
}
```
运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

**结果正确**




**下面是题中所说的两个数组的归并排序:**


```
 #include <iostream>
using namespace std;
void merge(int *A,int *B,int low,int high,int mid){
    int length = (high-low+1);
    int i=low;
    int j=mid+1;
    int k1[length],k2[length];
    int m1=0, m2=0;
    while(i<=mid&&j<=high){
        if(A[i]<=A[j]){
            k1[m1++] = A[i++];
            k2[m2++] = B[i++];
        }else{
            k1[m1++] = A[j++];
            k2[m2++] = B[j++];
        }
    }
    while(i<=mid){
        k1[m1++] = A[i++];
        k2[m2++] = B[i++];
    }
    while(j<=high){
        k1[m1++] = A[j++];
        k2[m2++] = B[j++];
    }
    for(int p=0;p<m1;p++){
        A[low+p] = k1[p];
        B[low+p] = k2[p];
        
    }
}

void mergeSort(int *A,int *B,int low,int high){
    if(high>low){
        int mid=(low+high)/2;
        mergeSort(A,B,low,mid);
        mergeSort(A,B,mid+1,high);
        merge(A,B,low,high,mid);
    }
    else return;
}



int main()
{
   
    int n;
    cout<<"请输入数据:"<<endl;
    cin>>n;
    int A[n],B[n];
    int a,b,flag=0,max,maxi;
    for(int i=0;i<n;i++)   cin>>A[i]>>B[i];
    mergeSort(A,B,0,n-1);
    cout<<"输出结果"<<endl;
    for(int i=0;i<n;i++)   cout<<A[i]<<" "<<B[i]<<endl;
}
```
运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

结果错误??????

不知道错在哪了
搜索更多相关主题的帖子: 排序 int mid i++ for 
2018-05-01 11:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
用了代码比较器,否则……

第一段
if(A[i]<=A[j]){
            k1[m++] = A[i++];
对应第二段
        if(A[i]<=A[j]){
            k1[m1++] = A[i++];
            k2[m2++] = B[i++];
也就是 i 自增了两次
2018-05-02 09:05
zyuanlin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-5-1
收藏
得分:0 
回复 2楼 rjsp
明白了,谢谢。感觉自己还是太粗心了
2018-05-17 23:27
快速回复:对两个数组同时进行归并排序时出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039900 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved