我正在尝试实现以下算法: 假设有一个数组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
请帮帮我
答案 0 :(得分:2)
我没看好你的算法是对的,但是当我看到:
while(a[m][n]>pivot) --m;--n;
我认为你的意思是:
while(a[m][n]>pivot) { --m;--n; }
答案 1 :(得分:1)
您提出的问题没有一般解决方案。具体而言,不能保证小于初始枢轴值的所有值都适合初始轴点的左侧,也不能保证所有大于初始值的值都适合初始轴点的右侧。
您需要放宽您的要求,以便在执行算法期间允许枢轴值或枢轴位置发生变化。