多维数组的分区

时间:2011-09-07 14:42:04

标签: c++ algorithm matrix

我正在尝试实现以下算法: 假设有一个数组a [3] [3],我的目标是选择一些枢轴元素,例如[1] [1]并进行分区,使得所有元素少于a [1] [1]必须在左边侧面和枢轴元件上方,以及右侧和枢轴元件下方的所有更大元件。例如,考虑以下矩阵:

6 4 3
8 5 2
1 7 9

其中一个可能的分区是

3 4 6
2 5 7
1 8 9

如你所见,所有较少的元素位于左侧和枢轴上方,称为4.而其他元素位于右侧和枢轴下方,为8。 这是我的代码

#include <iostream>
using namespace std;
int main(){
  int a[3][3];
  for (int i=0;i<3;i++) {
    for (int j=0;j<3;j++){
      cin>>a[i][j];
    }
  }

  int i=0;
  int j=0;
  int n=2;
  int m=2;
  int pivot=a[1][1];

  while(  m>i && n>j) {
    while(a[m][n]>pivot)  --m;--n;
    while( a[i][j]<pivot) ++i;++j;

    int t=a[i][j];
    a[i][j]=a[m][n];
    a[m][n]=t;
  }

  for (int i=0;i<3;i++){
    for (int j=0;j<3;j++){
      cout<<a[i][j]<<"  ";
    }
    cout<<endl;
  }
  return 0;
}

但是当我输入上面提到的矩阵时我得到了错误的结果

6  5  3
8  4  2
1  7  9

请帮帮我

2 个答案:

答案 0 :(得分:2)

我没看好你的算法是对的,但是当我看到:

while(a[m][n]>pivot) --m;--n;

我认为你的意思是:

while(a[m][n]>pivot) { --m;--n; }

答案 1 :(得分:1)

您提出的问题没有一般解决方案。具体而言,不能保证小于初始枢轴值的所有值都适合初始轴点的左侧,也不能保证所有大于初始值的值都适合初始轴点的右侧。

您需要放宽您的要求,以便在执行算法期间允许枢轴值或枢轴位置发生变化。