c++ - 数组分区函数

标签 c++ arrays

我正在编写一个获取 int 数组及其大小的函数:

void partition(int data[], int size) 

数组的第一个元素被分配给名为 val 的变量,函数需要对数组进行分区,使得 val 左侧的元素小于val,右边的元素更大。

例如,

  • 如果数组是:5 2 10 4 1 12 7(val 变为 5)

    <
  • 输出应该是2 4 1 5 10 12 7

顺序无关紧要,所以 1 2 4 5 12 7 10 也是有效的输出

所以我写了这段代码:

void partition(int data[], int size)
{
    int val = data[0];
    int i = 0, j = size - 1;//array indices
    while (i != j)
    {
        while (data[i] < val)
            i++;
        while (data[j] > val)
                j--;
        swapInArray(data, i, j);
    }
}

它工作正常,除非它得到一个元素等于 val 的数组。

例如:7 8 5 176 18 19 7 12 44

最佳答案

一些更改应该可以解决它。

  1. 使用while ( i < j )而不是 while ( i != j ) .
  2. 使用while (data[i] <= val)而不是 while (data[i] < val)

这是我的建议:

void partition(int data[], int size)
{
   int val = data[0];
   int i = 0, j = size - 1;
   while (i < j)
   {
      while (data[i] <= val)
         i++;
      while (data[j] > val)
         j--;
      swapInArray(data, i, j);
   }
}

更新

需要进行更多更改。

  1. 调用swapInArray仅当i < j .
  2. j 交换枢轴- 末尾的第一个元素,如有必要。

更新函数:

void partition(int data[], int size)
{
   int val = data[0];
   int i = 1, j = size - 1;//array indices
   while (i < j)
   {
      while (i < j && data[i] <= val)
         i++;

      while (data[j] > val)
         j--;

      if ( i < j )
         swapInArray(data, i, j);
   }
   if ( val > data[j] )
      swapInArray(data, 0, j);
}

http://ideone.com/5A3wTN 查看它的工作情况.

关于c++ - 数组分区函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501705/

相关文章:

c++ - GetProcessMemoryInfo 失败,错误 6 句柄无效

c++ - 检测意外的弱链接符号

c++ - 在 C++ 中可以完全避免使用模板吗?

c - 对数组中的元素进行排序以返回特定整数第一次出现的索引

javascript - 根据子数组属性过滤数组中的唯一值

c++ - 将通用 Lambda 与 std::find_if 结合使用

c++ - 错误 :request for member of non class type

arrays - 使用 LAMBDA 递归函数从字符串中删除所有数字

javascript - 找出数组中所有相同的数字

ios - 在 TableView 单元格中使用步进器 - 但返回到 VC 的数据未正确更新