数组分区功能

时间:2015-12-28 22:27:44

标签: c++ arrays

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

void partition(int data[], int size) 

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

例如,

  • 如果数组为:5 2 10 4 1 12 7val变为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 个答案:

答案 0 :(得分:2)

一些改变应该解决它。

  1. 使用while ( i < j )代替while ( i != j )
  2. 使用while (data[i] <= val)代替while (data[i] < val)
  3. 这是我的建议:

    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
    2. 时致电i < j
    3. 如有必要,将结果与末尾的j元素交换。
    4. 更新功能:

      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处查看它。