c - 将 C 数组拆分为 n 个相等的部分

标签 c arrays

我试图通过计算开始和结束索引将一个数组分成 n 个相等的部分。开始和结束元素的地址将被传递给对这些数组进行排序的函数。例如,如果 arraySize = 1000,并且 n=2,则索引将为 0、499、999。到目前为止,我有以下代码,但对于奇数 n,它将其拆分为多个数组。我想到的另一种方法是通过循环运行 n 次,但我不确定从哪里开始。

  int chunkSize = arraySize / numThreads;
  for (int start = 0; start < arraySize; start += chunkSize) {
      int end = start + chunkSize - 1;
      if (end > arraySize - 1) {
          end = arraySize - 1;
      }

      InsertionSort(&array[start], end - start + 1);
  }

编辑:这是我想出的其他东西。它似乎有效,但我需要做一些更彻底的测试。我已经画了很多次并用手追踪了它。希望没有任何边缘情况会失败。我已经在限制 n >= arraySize。
int chunkSize = arraySize / numThreads;
for (int i = 0; i < numThreads; i++) {
    int start = i * chunkSize;
    int end = start + chunkSize - 1;
    if (i == numThreads - 1) {
        end = arraySize - 1;
    }

    for (int i = start; i <= end; i++) {
        printf("%d ", array[i]);
    }
        printf("\n");
}

最佳答案

使用截断除法计算最小块大小。然后计算余数。通过将 1 加到一些 block 上来分配这个余数:

伪代码:

chunk_size = array_size / N
bonus = array_size - chunk_size * N  // i.e. remainder

for (start = 0, end = chunk_size;
     start < array_size;
     start = end, end = start + chunk_size)
{
  if (bonus) {
    end++;
    bonus--;
  }

  /* do something with array slice over [start, end) interval */
}

例如,如果 array_size 为 11 且 N == 4,则 11/N 产生 2。余数(“奖金”)为 3:11 - 2*3 .因此,循环的前三个迭代将大小加 1:3 3 3。然后奖金达到零,最后一个 block 大小将仅为 2。

我们在这里所做的只不过是以某种令人满意的方式在离散量化中分配一个误差项。这正是使用 Bresenham 算法在光栅显示器上绘制线段时发生的情况,或者当使用 Floyd-Steinberg 抖动等方法将图像减少为较少数量的颜色时会发生这种情况。

关于c - 将 C 数组拆分为 n 个相等的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36526259/

相关文章:

c - 如何在被调用方中获取参数整数?

c - 左值需要作为 c 中赋值的左操作数

c++ - GCC死于试图在OSX 10.6上编译64位代码

c - 除了(可能)内存使用之外,是否将 uint32 交换为 uint64 良性?

javascript - 使用映射函数格式化数据+在数组中获取数组但不想要

arrays - Bash,变量和数组

c - C程序运行时出现错误

javascript - 按特定键对对象数组进行排序

python - reshape numpy 数组的列表,然后 reshape 回来

java - 返回数组的问题