C ++中2D阵列的冒泡排序

时间:2014-04-15 21:23:11

标签: c++ arrays 2d

我尝试使用冒泡排序在c ++中对所有2D数组元素进行排序,但我无法弄明白。

#include <iostream>
#include <stdio.h>
using namespace std;
int main (){    

int x[4][4],i,k,j;
for(i=0;i<4;i++)
    for(j=0;j<4;j++)
        cin>>x[i][j];

cout<<"\n\n";

for(i=0;i<4;i++)
    for(j=0;j<3;j++)
        for(k=j+1;k<4;k++)
            if(x[i][j]>x[i][k])
            {
                int temp = x[i][j];
                x[i][j] = x[i][k];
                x[i][k] = temp;
            }           

for(i=0;i<4;i++)
    {
    for(j=0;j<4;j++)
        cout<<x[i][j]<<"\t";
        cout<<"\n\n";       
    }


cout<<endl;
return 0;
}

问题是,我不确定这些元素是否正确排序。我想我应该把另一个用于循环,但我不知道在哪里。

此外,是否可以最小化上面的代码只使用2个循环?我认为我可以,但我不确定我是如何做到的,因为&#39; j&#39;必须小于1.

我的主要问题是对所有元素进行排序。

2 个答案:

答案 0 :(得分:1)

这段代码不适合C ++,让我指出一件事:

为此:

int temp = x[i][j];
x[i][j] = x[i][k];
x[i][k] = temp;

C ++有一个内置函数std::swap,在标题algorithm中声明,所以你可以使用:

std::swap(x[i][j], x[i][k]);

现在,对于算法。如果你输入这样的矩阵:

16 8 3 2
4 5 15 10
11 12 13 14
1 6 9 7

应输出

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

没什么新的。

排序算法应如下所示:

for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
        int m = i;
        int n = j + 1;
        while (true) {
            if (n == 4) {
                n = 0;
                m++;
                if (m == 4) break; // Stopping condition: n == 4 && m == 4
            }

            if (x[i][j] > x[m][n]) std::swap(x[i][j], x[m][n]);

            n++;
        }
    }
}

答案 1 :(得分:1)

你可以看看下面哪些可能会令人惊讶,但是工作正常,但是使用qsort而不是冒泡排序......

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int myfunction (int* i,int* j) { return (*i>*j); }
int main (){    
   int x[4][4],i,k,j;
   for(i=0;i<4;i++)
      for(j=0;j<4;j++)
         x[i][j] = random()%1000;

   qsort((void*)x, 16, sizeof(int),(int (*)(const void*,const void*))myfunction);

   for(i=0;i<4;i++) {
      for(j=0;j<4;j++)
          cout<<x[i][j]<<"\t";
      cout<<"\n\n";       
   }
}

这里有一个技巧,因为我们只是使用qsort对一维数组进行排序。这个技巧是可能的,因为x [4] [4]的内存布局是16个连续的整数,所以你可以像访问x [16]一样进行访问 - 你可以用这个事实来实现传统的泡泡sort,只是转换为int y =(int )x;然后从(0..15)中排序y,因为它是一维数组。

但是如果你是C / C ++中级程序员的新手,我不会推荐这个,因为你可能会得到它可怕的错误 - 你也可能不会在这样做时获得任何性能提升,因为优化器很漂亮好的和展开的循环,现代的管道CPU在执行像上面这样的紧密循环时非常快。

<强>更新

作为冒泡排序,以下仅使用两个循环;

for(i=0;i<16;i++)
  for(j=i;j<16;j++)
    if(x[i/4][i%4]>x[j/4][j%4])
    {
        int temp = x[i/4][i%4];
        x[i/4][i%4] = x[j/4][j%4];
        x[j/4][j%4] = temp;
    }  

如果你坚持要求每个维度都有单独的循环,那么这是正确的方法;

for (int ia=0; ia <4; ia++)
  for (int ja=0; ja <4; ja++)
    for (int ib=0; ib <4; ib++)
      for (int jb=0; jb <4; jb++)
        if(x[ia][ib]<x[ja][jb])
        {
            int temp = x[ia][ib];
            x[ia][ib] = x[ja][jb];
            x[ja][jb] = temp;
        }