- 利用一维数组的冒泡思想:
在一维数组中,想要实现元素的排序,会利用相邻的两元素进行比较,若前大后小,则交换两元素的思想(最后得出的为升序数组)。
- 利用这种思想,当数组为二维时:
将二维数组当作一个大的一维数组,利用一维数组的冒泡思想去进行排序。
需要注意的是:
1.在二维数组中,我们无法像在一维数组冒泡一样利用内外循环的 i,j来准确的确定要对比的两元素的下标。因此我们另设 x, y 来对元素进行确定。(x 表示行标,y 表示列标)
2.在二维数组中,行,列标取值的变化需要注意。
例如:在3x3的二维数组中:
当比较a [0][2]与a[1][0]两个元素时,(即行最尾端元素与下一行最前端元素比较)此时要注意相关行标:x 与相关列标 :y 的变化。
if(y==m-1){ //此if用于判断,前一行的最后一个元素与下一行的第一个
int p=x; //元素比较
int q=y;
x++;
y=0;
if(a[p][q]>a[x][y]){
int temp=a[x][y];
a[x][y]=a[p][q];
a[p][q]=temp;
}
m 表示的是列的大小,当y==m-1。(3x3的二维数组中,当y==2时)
比较行最尾端元素与下一行最前端元素。想要得到下一位元素位置,则列标要被赋值为0(因为此时已经到了某行的最尾列)。而行标要进行自加(移到了下一行)
完整代码:
#include <iostream>
using namespace std;
int main(){
int a[][4]={61,50,66,93,45,77,100,89,37,67,96,98,80,67,59,84};
int all=sizeof(a)/sizeof(int); //数组长度
int n=sizeof(a[0])/sizeof(a[0][0]); //n为行数
int m=all/n; //m为列数
for(int i=0;i<n*m;i++){
int x=0;
int y=0;
for(int j=0;j<n*m-1-i;j++){
if(y==m-1){ //此if用于判断,前一行的最后一个元素与下一行的第一个
int p=x; //元素比较
int q=y;
x++;
y=0;
if(a[p][q]>a[x][y]){
int temp=a[x][y];
a[x][y]=a[p][q];
a[p][q]=temp;
}
}
else{
if(a[x][y]>a[x][y+1]){
int temp=a[x][y+1];
a[x][y+1]=a[x][y];
a[x][y]=temp;
}
y++;
}
}
//cout<<endl;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
输出结果:
第一次写这种,要是写的不好请见谅,感觉文中废话有点多。主要是想讲详细一点,希望对你们有帮助。