我尝试使用冒泡排序在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.
我的主要问题是对所有元素进行排序。
答案 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;
}