65,211
社区成员
发帖
与我相关
我的任务
分享
#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;
}
//¼ÆÊýÅÅÐò
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);
}
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);
}
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;
}
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);
}
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要干嘛,所以也不能给出修改意见~呵呵~~自己再琢磨琢磨!