在C中排序double数组

时间:2011-12-09 16:44:59

标签: c arrays sorting double

如果我有一个数组

double i[5] = {1.023, 1.22, 1.56, 2, 5, 3.331};

如何对值进行排序,使它们看起来像这样:

double i[5] = {1.023, 1.22, 1.56, 2, 3.331, 5};

我尝试过没有运气的qsort(),在尝试了一些例子之后,我想出了:

qsort(i, 5, sizeof(double), sort);

int sort(const void *x, const void *y)
{
return (*(double*)x - *(double*)y);
}

with => 错误:参数1 的类型不兼容 不排序数组.....

1 个答案:

答案 0 :(得分:13)

qsort的第一个参数是指向要排序的数组的开头的指针。而不是

qsort(i[5], 5, sizeof(double), sort);

应该阅读

qsort(i, 5, sizeof(double), sort);

进一步的观察:

  1. i初始化程序的长度不正确(i有五个元素,但初始化程序有六个)。
  2. 将5强硬编码到qsort电话中,以后会遇到麻烦。
  3. 名称“i”最常用于循环计数器等。
  4. 调用比较函数sort令人困惑。
  5. 您的比较功能有误。考虑如何比较数字1.11.2。还要考虑如果两个值之间的差异不适合int会发生什么。
  6. 我会像这样重写你的整个例子:

    double arr[] = {1.023, 1.22, 1.56, 2, 5, 3.331};
    
    int cmp(const void *x, const void *y)
    {
      double xx = *(double*)x, yy = *(double*)y;
      if (xx < yy) return -1;
      if (xx > yy) return  1;
      return 0;
    }
    
    int main() {
      qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), cmp);
    }
    

    请注意,上述比较功能仍然无法正确处理NaN;我把它作为练习让读者解决这个问题。