求助:用vector实现的计数排序运行时出错。

zwdnet 2008-11-16 05:02:42
我写一个计数排序的程序,用STL的vector,运行时出现内存不能为"written“的错误,详细代码:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <myclock.h>

using namespace std;

void show(const vector<int> & A)
{
for (int i = 0; i < A.size(); i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
}

//计数排序
void jsort(vector<int> & A)
{
int n = A.size();
vector<int> B(n, 0), C(n, 0);
for (int i = 0; i < n; i++)
{
C[A[i]]++;
}
for (int i = 1; i < n; i++)
{
C[i] += C[i-1];
}
show(C);
for (int i = n-1; i >= 0; i--)
{
B[C[A[i]]] = A[i]; //我跟踪到这里,运行一次循环以后就报错(“段异常”),把这句注释掉
//就没报错了。
--C[A[i]];
}
show(C);
}

int main()
{
int n;
vector<int> v1, v2;
cout<<"输入数据规模:";
cin>>n;
if (n <= 0)
{
cout<<"输入错误!"<<endl;
system("pause");
exit(1);
}
srand(time(NULL));
for (int i = 0; i < n; i++)
{
int tmp = rand()%n + 1;
v1.push_back(tmp);
v2.push_back(tmp);
}
show(v1);
jsort(v1);
system("pause");
return 0;
}

我怀疑是“B[C[A[i]]] = A[i]; ”这句有问题,越界?请问要怎么改?谢谢!
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbihong 2008-11-16
  • 打赏
  • 举报
回复
vector是什么,没听说过!!!
zwdnet 2008-11-16
  • 打赏
  • 举报
回复
谢谢hqin6,这样改了就对啦,看来尽信书不如无书啊!

//¼ÆÊýÅÅÐò
void jsort(vector<int> & A)
{
int n = A.size();
//vector<int> B(n, 0), C(n, 0);
vector<int> B, C;
for (int i = 0; i < n; i++)
{
B.push_back(0);
C.push_back(0);
}
for (int i = 0; i < n; i++)
{
C[A[i]]++;
}
for (int i = 1; i < n; i++)
{
C[i] += C[i-1];
}
for (int i = n-1; i >= 0; i--)
{
B[C[A[i]] - 1] = A[i]; //这里改了
--C[A[i]];
}
show(B);
}
wzyzb 2008-11-16
  • 打赏
  • 举报
回复
楼主的记数排序 写的有点糟 在看看记数排序
zwdnet 2008-11-16
  • 打赏
  • 举报
回复
谢谢几位
tnfyj:
我把

vector<int> B(n, 0), C(n, 0);

改成

vector<int> B, C;
for (int i = 0; i < n; i++)
{
B.push_back(0);
C.push_back(0);
}

问题照旧
wzyzb:
我把for (int i = n-1; i >= 0; i--)改成for (int i = n-1; i >= 1; i--)问题依旧。我是按一本书上的伪代码写的,伪代码如下(它的数组是从1到n:

1.fillchar (C, sizeof(C), 0) //数组C清零
2.for j<-1 to n do C[A[j]]<-C[A[j]] + 1;
//统计相同元素个数
3.P<-C; //P[i]包含等于i的元素个数 这句我略了
4.for i<-2 to k do C[i]<-C[i] + C[i-1];
//C[i]包含小于等于i的元素个数 k为输入数据的最大值,我的程序里k = n
5.for j<-n downto 1 do
{
B[C[A[j]] <- A[j]; //原文如此,好像少个"]" 即 B[C[A[j]]] <- A[j];
C[A[j]] <- C[A[j]] - 1;
}

目前我的排序的c++函数为:

void jsort(vector<int> & A)
{
int n = A.size();
//vector<int> B(n, 0), C(n, 0);
vector<int> B, C;
for (int i = 0; i < n; i++)
{
B.push_back(0);
C.push_back(0);
}
for (int i = 0; i < n; i++)
{
C[A[i]]++;
}
for (int i = 1; i < n; i++)
{
C[i] += C[i-1];
}
show(C);
for (int i = n-1; i >= 1; i--)
{
B[C[A[i]]] = A[i];
--C[A[i]];
}
show(C);
}

出的问题依旧,麻烦帮忙看看是不是我哪里实现错了?谢谢!
太乙 2008-11-16
  • 打赏
  • 举报
回复


B[C[A[i]]] = A[i]; //我跟踪到这里,运行一次循环以后就报错(“段异常”),把这句注释掉
//就没报错了。
--C[A[i]];

lz要干嘛啊??
我看半天不懂!

bug很简单能调试:

比如:
A: 2 2 2 3

第一个for之后是:0 0 3 1

那么:两个for之后,是:
0 0 3 4

然后下面的一个for
出现了B[4],看明白了吧?????

这里就错了!!!!!

因为不知道lz要干嘛,所以也不能给出修改意见~呵呵~~自己再琢磨琢磨!





wzyzb 2008-11-16
  • 打赏
  • 举报
回复
for (int i = n-1; i >= 0; i--)
{
B[C[A[i]]] = A[i]; //我跟踪到这里,运行一次循环以后就报错(“段异常”),把这句注释掉
//就没报错了。
--C[A[i]]; 这里当C[A[i]]为0时 后面就会出错
}
tnfyj 2008-11-16
  • 打赏
  • 举报
回复
B 和 C的大小是不确定的,你只是假设他们的大小都和A的一样了 ,可事实上 你这样直接为某个地址的元素赋值根本不会导致vector长度的增长,你应该用push_back() 这样编译器才会自动为你增长空间
giftfish 2008-11-16
  • 打赏
  • 举报
回复
好好看看 Counting sort,你这错的

65,210

社区成员

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

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