c++ - 桶排序和用户输入

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

这是我正在处理的问题:用户在标准 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/

相关文章:

c++ - 为什么隐式转换不应用于模板化函数参数?

C++ vector push_back

c++ - 从内部类调用模板函数

c++ - 为什么下面的变量赋值不能正常工作?

sorting - elasticsearch 聚合对存储桶键进行排序

java - Java中的桶排序

algorithm - 美国国旗排序优化

c++ - 如何使用 boost 预处理器生成访问器?

c++14 static constexpr auto 与 odr 用法

c++ - 测量移植到嵌入式平台的 C++ 的静态内存使用情况