存储桶排序和用户输入

时间:2015-03-05 05:19:37

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

以下是我正在处理的问题:用户在标准的x,y坐标平面上给出了一个未指定数量的点,其中0 <0。 x ^ 2 + y ^ 2&lt; = 1.(x平方加y平方,仅为了清楚起见)。 以下是输入的示例:

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

如果有人可以提供任何可以使其工作的功能的编辑建议,那么将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下是一些可以解决的问题:

输入循环在读取非整数时将停止。将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