二维数组排序的三种方法
#include #define iline 2//行。fun3()中用#define irow 8//列。fun3()中用 /***************************例子中: 以字符数组为例。 以冒泡排序为排序方法。----************************/ //第一种方法:
·
#include <stdio.h>
#define iline 2//行。fun3()中用
#define irow 8//列。fun3()中用
/***************************
例子中:
以字符数组为例。
以冒泡排序为排序方法。
----************************/
//第一种方法:将二维数组转置到一维数组,再对一维数组排序
void
fun1()
{
int
i=0,j=0,k=0,t=0;
char
a[2][8]={
"1354689"
,
"3456378"
};
char
b[2*8];
printf
(
"fun1()运行如下:\n"
);
//将二维数组转置到一维数组
while
(i<2)
{
while
(j<8-1)
{
b[k++]=a[i][j];
j++;
}
i++;
j=0;
}
b[k]=
'\0'
;
//最后一个
puts
(b);
//先看看是不是成功转置
//以下比较容易理解的冒泡排序,一个个比较,交换。不过效率较低
for
(i=0;i<16;i++)
{
for
(j=0;j<16;j++)
{
if
(b[i]>b[j])
//从大到小排序,若要从小到大,你懂的。
{
//交换二者的值
t=b[i];
b[i]=b[j];
b[j]=t;
}
}
}
puts
(b);
//输出看看结果
}
void
fun2()
//fun3是fun2的通用版本
{
int
i=0,j=0;
char
t;
char
a[2][8]={
"1354689"
,
"3456378"
};
printf
(
"\nfun2()运行如下:\n"
);
for
(i=0;i<2*8;i++)
{
for
(j=0;j<2*8;j++)
{
if
(i==(i/8+1)*8-1 || j==(j/8+1)*8-1)
{
//什么都不做
}
else
{
if
(a[i/8][i%8]>a[j/8][j%8])
{
t=a[i/8][i%8];
a[i/8][i%8]=a[j/8][j%8];
a[j/8][j%8]=t;
}
}
}
}
i=0;
while
(i<2)
{
puts
(a[i]);
i++;
}
}
void
fun3()
{
int
i=0,j=0;
char
t;
char
a[iline][irow]={
"1354689"
,
"3456378"
};
printf
(
"\nfun3()运行如下:\n"
);
for
(i=0;i<iline*irow;i++)
{
for
(j=0;j<iline*irow;j++)
{
if
(i==(i/irow+1)*irow-1 || j==(j/irow+1)*irow-1)
//还是要注意每行结尾的\0.
{
//什么都不做
}
else
{
if
(a[i/irow][i%irow]>a[j/irow][j%irow])
{
t=a[i/irow][i%irow];
a[i/irow][i%irow]=a[j/irow][j%irow];
a[j/irow][j%irow]=t;
}
}
}
}
i=0;
while
(i<2)
{
puts
(a[i]);
i++;
}
}
int
main()
{
fun1();
//法一:将二维数组转成一维数组来做
fun2();
//法二:直接对二维数组排序
fun3();
//法二的通用版。不过这里数组是两行的,要对应哦。
//当然,这里也可以用更通用地用传参的方式将传入数组a[][irow].这些就自己想咯。
return
0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)