帮忙看看我的这个归并排序。VC下运行有错,其他的编译器下运行正确,为什么!

wonxlei 2007-10-18 02:56:17
代码如下:
#include <iostream>
using namespace std;

void merge(int* arr, int p, int q, int r)
{
int s=q-p+1;
int t=r-q;
int* Larr=new int [s];
int* Rarr=new int [t];
for(int i=0;i!=s;i++)
Larr[i]=arr[p+i];
for(int i=0;i!=t;i++)
Rarr[i]=arr[q+i+1];
int i=0,j=0;
for(int k=p;k!=r;k++)
{
if(Rarr[j]>=Larr[i])
{
arr[k]=Larr[i];
i++;
}
else
{
arr[k]=Rarr[j];
j++;
}
}
delete []Rarr;
delete []Larr;
}

void merge_sort(int* arr,int lhs, int rhs)
{
if(lhs<rhs)
{
int q=(lhs+rhs)/2;
merge_sort(arr,lhs,q);
merge_sort(arr,q+1,rhs);
merge(arr,lhs,q,rhs);
}
}

int main()
{
int a[8]={2,4,5,7,1,3,6,8};
merge_sort(a,0,7);
int i=0;
while(i<8)
{
cout << a[i]<< " ";
i++;
}
system("PAUSE");
return 0;
}

我是严格按照归并排序的算法来的
实在找不到错误源了
大家帮忙看看,谢谢~!尽可能在不同的编译器里面试下

我在MinGW Studio下运行有正确的结果。
...全文
120 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lei_zhuyan 2009-02-15
  • 打赏
  • 举报
回复
OK~
chinesern 2007-10-18
  • 打赏
  • 举报
回复
下面是改正后的程序,VC6.0调试正确

#include <iostream >
using namespace std;

void merge(int* arr, int p, int q, int r)
{
int s=q-p+1;
int t=r-q;
int* Larr=new int [s];
int* Rarr=new int [t];
for(int i=0;i < s;i++)
*(Larr+i) = *(arr+p+i );
for( i=0;i < t;i++)
*(Rarr+i) = *(arr+q+i+1 );
i=0; // 不能重复定义 i
int j=0;
for(int k=p;k <= r;k++)
{

if(*(Rarr + j) >= *(Larr + i))
{
if (i < s) // 检测R和L数组的边界
{
* (arr + k) = *(Larr + i++);
}
else
{
* (arr + k) = *(Rarr + j++);
}

}
else
{
if (j < t) // 检测R和L数组的边界
{
* (arr + k)= *(Rarr + j++);
}
else
{
* (arr + k) = *(Larr + i++);
}
}
}


delete [] Rarr;
delete [] Larr;
}

void merge_sort(int* arr,int lhs, int rhs)
{
if(lhs < rhs)
{
int q=(lhs+rhs)/2;
merge_sort(arr,lhs,q);
merge_sort(arr,q+1,rhs);
merge(arr,lhs,q,rhs);
}

}

int main()
{
int a[8]={2,4,5,7,1,3,6,8};
int b[8]={3,8,9,5,4,2,7,6} ;
merge_sort(a,0,7);
merge_sort(b,0,7);

for(int i = 0; i< 8 ; i++ )
cout << a[i] <<" " ;
cout << endl;
for(int j = 0; j< 8 ; j++ )
cout << b[j] <<" ";
cout << endl;

system("PAUSE");
return 0;
}
thornbird_2007 2007-10-18
  • 打赏
  • 举报
回复
two errors
1. for(int k=p;k!=r;k++) ==> for(int k=p;k<=r;k++), 实际上这次排序要处理p到r的排序,所以要包含r.
2. 要检测R和L数组的边界。
if(i >= s)//L array is put all, just put R array
{
arr[k] = Rarr[j];
j++;
continue;
}
if (j >= t) //R array is put all, just put L array
{
arr[k] = Larr[i];
i++;
continue;
}
希望有用。
ckt 2007-10-18
  • 打赏
  • 举报
回复
这是网上资料 你可以参考ia

template <class T>
void Merge(T a[], int left, int center, int right, int n)
{
T *t = new T[n];//存放被排序的元素
int i = left;
int j = center + 1;
int k = 0;

while (i<=center && j<=right)
{
if (a[i] <= a[j])
t[k++] = a[i++];
else
t[k++] = a[j++];
}

if (i == center+1)
{
while (j <= right)
t[k++] = a[j++];
}
else
{
while (i <= center)
t[k++] = a[i++];
}
//把t[]的元素复制回a[]
for (i=left,k=0; i<=right; i++,k++)
a[i] = t[k];

delete []t;
}

template <class T>
void MergeSort(T a[], int n)
{
int beforeLen; //合并前序列的长度
int afterLen = 1;//合并后序列的长度

for (beforeLen=1; afterLen<n; beforeLen=afterLen)
{
int i = 0;//开始合并时第一个序列的起始位置下标,每次都是从0开始
afterLen = 2 * beforeLen; //合并后序列的长度是合并前的两倍

while (i+afterLen < n)
{
Merge(a, i, i+beforeLen-1, i+afterLen-1, afterLen);
i += afterLen;
}

if (i+beforeLen < n)
Merge(a, i, i+beforeLen-1, n-1, n);
}
}

int main()
{
int a[10] = { 1123, 23211,3123,42,15,622,42427,8424,9,10};
MergeSort<int>(a, 10);
}


  • 打赏
  • 举报
回复
VC8 直接编译过去
ckt 2007-10-18
  • 打赏
  • 举报
回复
VC6.0不支持标准C++
对于:for(int i=0;i!=t;i++)
i的生存期是在整个函数结束,而不是for循环结束,所以会VC6.0有重复定义i的错误
int i=0,j=0;
Seu_why 2007-10-18
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include "stdlib.h"
#include<stdio.h>
#include "iostream.h"
void merge(int* arr, int p, int q, int r)
{
int s=q-p+1;
int t=r-q;
int* Larr=new int [s];
int* Rarr=new int [t];
for(int i=0;i!=s;i++)
Larr[i]=arr[p+i];
for( i=0;i!=t;i++)
Rarr[i]=arr[q+i+1];
int j=0;
i=0;
for(int k=p;k!=r;k++)
{
if(Rarr[j] >=Larr[i])
{
arr[k]=Larr[i];
i++;
}
else
{
arr[k]=Rarr[j];
j++;
}
}
delete []Rarr;
delete []Larr;
}

void merge_sort(int* arr,int lhs, int rhs)
{
if(lhs <rhs)
{
int q=(lhs+rhs)/2;
merge_sort(arr,lhs,q);
merge_sort(arr,q+1,rhs);
merge(arr,lhs,q,rhs);
}
}

int main()
{
int a[8]={2,4,5,7,1,3,6,8};
merge_sort(a,0,7);
int i=0;
while(i <8)
{
cout<< a[i]<< " ";
i++;
}
system("PAUSE");
return 0;
}


可以编译,结果好像不对,自己再看看代码逻辑。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧