【问题标题】:Bucket sort and User input桶排序和用户输入
【发布时间】:2015-03-05 05:19:36
【问题描述】:

这是我正在解决的问题:用户在标准 x,y 坐标平面上给了我未指定数量的点,其中 0

0.2 0.38
0.6516 -0.1
-0.3 0.41
-0.38 0.2 

从那里,我计算这些点到原点的距离,(0, 0)。这是我用来查找距离并将其推入双精度向量 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);

}

然后,我想对向量 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 消息,说程序已停止工作。现在,我知道该函数有效,但只有当我初始化向量并同时填充它时。这是一个有效的调用示例:

double arr[] = {0.707107, 0.565685, 0.989949, 0.848528 };
int n = sizeof(arr)/sizeof(arr[0]); 
bucketSort(arr, n);

到目前为止,我还没有找到任何其他格式来调用和初始化函数将接受和运行的向量。我需要找到一种方法来获取点,计算距离并对距离进行排序。我正在插入并获得适得其反的当前主要内容:

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

如果任何人都可以提供任何功能的编辑建议以使其正常工作,我们将不胜感激。

【问题讨论】:

  • 向我们展示什么不起作用。
  • 稍作修改。希望对您有所帮助。
  • 您需要提供something that others can run to reproduce the problem。我们无法调试我们看不到的代码。
  • 如果 x 和 y 都 arr 以某种方式由B 组成(这不清楚),那么n*arr[i] 可能大于n 并溢出您的b 数组。
  • 为清晰起见进行了编辑,希望如此。 @TheDark,有道理,但这是我的错字。现在在开始时更改/澄清了这一点。 0

标签: c++ c++14 bucket-sort


【解决方案1】:

以下是一些需要解决的问题:

您的输入循环将在读取非整数时停止。将number 更改为double

你的尺寸计算

int n = (sizeof(B) + sizeof(B[0])) / sizeof(B[0]);

我不确定您要在这里做什么,但是矢量上的sizeof 不是您想要的。我认为将其替换为:

int n = B.size();

是你想要的。

我不确定您为什么需要将向量转换为数组来进行桶排序 - 将向量传递给桶排序要容易得多,然后大小随向量一起提供。

更改bucketSort 函数以引用向量:

void bucketSort(vector<double> &arr)
{
   int n = B.size();
   ...

然后将 B 传递给函数。其余代码应该是一样的。

还有一个可移植性说明:并非每个编译器都支持可变大小的数组,您最好尽可能坚持使用vector

【讨论】:

  • 这似乎完全奏效了。非常感谢,也很抱歉我一直用令人恼火的方式来表达我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
相关资源
最近更新 更多