问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

分治法排序

发布网友 发布时间:2022-04-26 07:58

我来回答

2个回答

热心网友 时间:2022-06-25 13:53

你写的太乱了。不完全是他说的漏掉数据问题。而是边界完全有问题,导致了数组内的数据都变成错误的了。看得有点乱。整了个比较规范的给你参考参考。
void merge(int a[] , int temp[] , int Lpos , int Rpos , int RightEnd)
{
int i , LeftEnd , num , tmppos;

LeftEnd = Rpos - 1;
tmppos = Lpos;
num = RightEnd - Lpos + 1;
while (Lpos <= LeftEnd && Rpos <= RightEnd)
if (a[Lpos] <= a[Rpos]) temp[tmppos ++] = a[Lpos ++];
else temp[tmppos ++] = a[Rpos ++];
while (Lpos <= LeftEnd) temp[tmppos ++] = a[Lpos ++];
while (Rpos <= RightEnd) temp[tmppos ++] = a[Rpos ++];
for (i = 0; i < num; i ++)
{
a[RightEnd] = temp[RightEnd];
RightEnd --;
}
}

void msort(int a[] , int temp[] , int L , int r)
{
int c;

if (L < r)
{
c = (L + r) / 2;
msort(a , temp , L , c);
msort(a , temp , c + 1 , r);
merge(a , temp , L , c + 1 , r);
}
}

void mergesort(int a[] , int n) //调用此函数,a为排序数组,n为数组个数
{
int temp[MAXN];//MAXN表示题目中可能出现的最大数组上限

msort(a , temp , 0 , n - 1);
}

热心网友 时间:2022-06-25 13:54

问题之处:
1.数组要传递引用,否则不会被改变。
2.代码要加括号:
for(int k=p-1;k!=r;++k) {
if(L[i]<=R[j]){
A[k]=L[i];
++i;
}
else if(L[i]>R[j]){
A[k]=R[j];
++j;
}
}
-------------------
完整代码:
#include<iostream>
#include<vector>
#include<cstdlib>

using namespace std;

void MERGE(vector<int> &A,int p,int q,int r)
{
int i,j,k=0;
int n1=q-p+1;
int n2=r-q;
vector<int> L((n1+1),0),R((n2+1),0);
for(vector<int>::size_type i=0;i!=n1;++i)
L[i]=A[p+i-1];
for(vector<int>::size_type j=0;j!=n2;++j)
R[j]=A[q+j];
L[n1]=88888;
R[n2]=88888;

i=0;
j=0;
for(int k=p-1;k!=r;++k) {
if(L[i]<=R[j]){
A[k]=L[i];
++i;
}
else if(L[i]>R[j]){
A[k]=R[j];
++j;
}
}
}
void MERGE_SORT(vector<int> &A,int p,int r)
{
int q;
if(p<r){
if((r-p+1) % 2==0)q=(r+p+1)/2-1;
if((r-p+1) % 2==1)q=(r+p)/2;
MERGE_SORT(A,p,q);
MERGE_SORT(A,q+1,r);
MERGE(A,p,q,r);
}
}
int main()
{
int val;
vector<int> A;
//while(cin>>val)
// A.push_back(val);
A.push_back(9);
A.push_back(8);
A.push_back(2);
A.push_back(4);
A.push_back(3);
MERGE_SORT(A,1,A.size());
for(vector<int>::iterator ix=A.begin();ix!=A.end();++ix)
cout<<*ix<<' ';
system("pause");
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 C++ 数据结构 排序 高分 急 c++用sort对vector排序问题 vector对自定义类中按照数组索引对应的值进行排序的问题? vector怎么先按字段排序 再此基础上 在按照另一个字段排序 c++中怎么用vector,sort降序排列 对vector容器的优先排序 vector元素排序 请问一下这个C语言冒泡排序 c++ vector sort 是什么排序 口罩用的无纺布和平常的无纺布有什么不同? vector中的升序算法是sort()但降序算法是啥呀?求用法? Java 如何对自定义类Vector进行排序 C++ vector 排序问题 c++中vector排序的问题 vector的排序功能 qsort对vector排序的问题 河南水煎包怎么做好吃 怎样才是做菜中的“焖”呢 生煎怎么做 河南水煎包的做法 煎焖法和煎酿法有什么区别? C语言快速排序算法问题,下面是我写的程序,最后出来的全是第一个数,求... c++怎么决定用vector,queue还是stack 帧的概念和作用 电脑的帧是干嘛的? 中老年适合用什么钙片? 适合老年人的钙片? 60岁老人补钙什么钙最好 老年人补钙吃哪种钙最容易吸收呢? 《航拍中国》的知识归纳有哪些? 航拍中国介绍 华为p50pro吃鸡画面怎么调? 中老年人吃什么钙最好 求央视纪录片《航拍中国》1080p下载资源 《航拍中国》知识点有哪些? 求纪录片《航拍中国》百度云资源 中老年人补钙吃什么牌子的钙片好、 从《航拍中国》探索机航拍美学 钙的品种很多,老年人用哪种钙比较好? 和平精英:新手会打开的功能,游戏界面该如何设置? 《和平精英》三指操作界面怎么设置 ?