【问题标题】:Merging and sorting two sorted arrays containing doubles in C在C中合并和排序两个包含双精度的排序数组
【发布时间】:2018-02-18 03:08:22
【问题描述】:

所以我有两个由双数组成的数组,它们是排序的。

我想最有效地将这些组合成一个数组,并让这个数组也排序。

我的第一个想法是,也许你可以简单地将它们连接在一起然后使用 qsort ,但这不会那么有效。所以也许改为使用归并排序?但是,我对如何在 C 中实现归并排序有点迷茫,有什么想法吗?

我正在使用其中一个答案中的代码来尝试合并排序。我还没有把它变成它自己的方法,等我让它工作之后再做。

double partitions[][5] = {{45.0, 5.0, 88.4, 0.4, 44.0}, {1000.0, 2.0, 3.4, 7.0, 50.0}};
double* res;

int n1 = sizeof(partitions[0])/sizeof(partitions[0][0]);
int n2 = sizeof(partitions[1])/sizeof(partitions[1][0]);
int n3 = n1 + n2;

res = malloc(n3 * sizeof(double));

// Merging starts
int i = 0;
int j = 0;
int k = 0;

while (i < n1 && j < n2) {
    if (partitions[0][i] - partitions[1][j] < 0.000001) {
        res[k] = partitions[0][i];
        i++;
        k++;
    }
    else {
        res[k] = partitions[1][j];
        k++;
        j++;
    }
}

/* Some elements in array 'arr1' are still remaining
where as the array 'arr2' is exhausted */
while (i < n1) {
    res[k] = partitions[0][i];
    i++;
    k++;
}

/* Some elements in array 'arr2' are still remaining
where as the array 'arr1' is exhausted */
while (j < n2) {
    res[k] = partitions[1][j];
    k++;
    j++;
}

int m;
for (m = 0; m < n3; m++)
    printf("%f \n", res[m]);

【问题讨论】:

  • 所以,你不需要排序算法,你只需要一个合并算法。让我们明确一点。
  • @VladfromMoscow 这不是一个解决方案。从对 OP 的 C 代码没有帮助的意义上说,这不是一个解决方案。
  • Non-Recursive Merge Sort的可能重复
  • 当然,这有点直观?从两个排序数组的顶部取最大或相等的值并将其存储在结果中?还是从底部最小的?

标签: c arrays sorting mergesort


【解决方案1】:

由于数组已排序,您只需要合并排序的合并部分,即 O(n1+n2) 其中n1 是一个数组的长度,n2 是另一个数组的长度:

例如:

void merge(int n1, int n2){ //suppose global arrays arr1,arr2 and result array

      i = 0;
      j = 0;
      k = 0;

    // Merging starts
    while (i < n1 && j < n2) {
        if (arr1[i] <= arr2[j]) {
            res[k] = arr1[i];
            i++;
            k++;
        } 
        else {
            res[k] = arr2[j];
            k++;
            j++;
        }
    }

    /* Some elements in array 'arr1' are still remaining
    where as the array 'arr2' is exhausted */

    while (i < n1) {
        res[k] = arr1[i];
        i++;
        k++;
    }

    /* Some elements in array 'arr2' are still remaining
    where as the array 'arr1' is exhausted */

    while (j < n2) {
        res[k] = arr2[j];
        k++;
        j++;
    }
}

另外我只是注意到您的数组包含双精度,因此您需要在比较两个数字时更改条件。例如,您需要为 if (arr1[i] &lt; arr2[j]) 编写条件而不是 if (arr1[i] &lt;= arr2[j]),然后是 else 部分。

【讨论】:

  • i,j,k的初始值是否=0?
  • @osk,是的,编辑了答案,观看关于双打的部分,你无法使用 == 比较相等性。
  • 我有两个要尝试的向量,partitions[0] 和 partitions[1]。我放 if (partitions[0][i] - partitions[1][j]
  • 我会把它添加到操作中
  • 你现在可以查看我的操作了,顺便谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 2013-07-13
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2018-07-14
  • 2014-11-06
相关资源
最近更新 更多