这是我正在处理的问题:用户在标准 x,y 坐标平面上给我未指定数量的点,其中 0 < x^2 + y^2 <= 1。(x 平方加 y 平方,只是为了清楚起见)。 这是输入的示例:
0.2 0.38
0.6516 -0.1
-0.3 0.41
-0.38 0.2
从那里,我计算这些点与原点 (0, 0) 的距离。这是我用来查找距离并将其插入 double vector B 的函数。
void findDistance(double x = 0, double y = 0) {
double x2 = pow(x, 2);
double y2 = pow(y, 2);
double z = x2 + y2;
double final = sqrt(z);
B.push_back(final);
然后,我想对 vector B 进行桶排序,其中 n 个点有 n 个桶。这是我当前构建的 bucketSort:
void bucketSort(double arr[], int n)
{
vector<double> b[n];
for (int i=0; i<n; i++)
{
int bi = n*arr[i];
b[bi].push_back(arr[i]);
}
for (int i=0; i<n; i++)
sort(b[i].begin(), b[i].end());
int index = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < b[i].size(); j++)
arr[index++] = b[i][j];
}
我的问题是我无法让 bucketSort 在不崩溃的情况下工作。我收到一条 Windows 消息,说该程序已停止运行。现在,我知道该函数有效,但只有在我初始化 vector 并同时填充它时才有效。这是一个有效的调用示例:
double arr[] = {0.707107, 0.565685, 0.989949, 0.848528 };
int n = sizeof(arr)/sizeof(arr[0]);
bucketSort(arr, n);
到目前为止,我还没有找到任何其他格式来调用和初始化函数将接受和运行的 vector 。我需要找到一种方法来获取点、计算距离并对距离进行排序。我插入的当前主要内容适得其反:
int main(){
int number;
while (cin >> number){
A.push_back(number); }
int q = 0; double r = 0; double d = 0;
while (q < (A.size() - 1)){
findDistance(A[q], A[q+1]);
q += 2;
}
double arr[B.size()]; copy(B.begin(), B.end(), arr);
int n = (sizeof(B) + sizeof(B[0])) / sizeof(B[0]);
bucketSort(arr, n);
int w = 0;
while (w < y){ cout << arr[w] << endl; w++; }
arr 拷贝是在一些奇怪的调试尝试中创建的:抱歉,如果不清楚。存储在 B 中的距离函数的结果,复制到 arr 中,arr 是试图排序的内容。用户输入是通过命令提示符给出的,使用开头列出的语法。输出应该是这样的:
0.42941
0.49241
0.50804
0.65923
如果有人可以对任何一个功能提供编辑建议以使其正常工作,我们将不胜感激。
最佳答案
这里有几个问题需要解决:
当读取到非整数时,您的输入循环将停止。将 number
更改为 double
你的尺寸计算
int n = (sizeof(B) + sizeof(B[0])) / sizeof(B[0]);
我不确定您在这里要做什么,但是 vector 上的 sizeof
不是您想要的。我想将其替换为:
int n = B.size();
就是你想要的。
我不确定为什么您需要将 vector 转换为数组以进行桶排序 - 只需将 vector 传递给桶排序就容易得多,然后大小随 vector 而来。
更改 bucketSort
函数以获取对 vector 的引用:
void bucketSort(vector<double> &arr)
{
int n = B.size();
...
然后将 B 传递给函数。其余代码应该相同。
还有一个可移植性说明:并非每个编译器都支持可变大小的数组,您最好尽可能坚持使用 vector
。
关于c++ - 桶排序和用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28870560/