如何将二维数组排序

int arr[][] = new int[][] { { 4, 78, 5 }, { 34, 7, 15 }, { 14, 8, 55 },{55 12 9} };将声明的那个数组排序成如下:注意看规律78 5 4 55 14 8 55 12 934 15 7

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 二维排序
{
class Program
{
static void Main(string[] args)
{
int[,] arr= new int[,] { { 4, 78, 5 }, { 34, 7, 15 }, { 14, 8, 55 },{55,12, 9} };
int i,j,k,l,temp;
for (i=0;i<4;i++)//一维数组内部排序。冒泡。
{
for (j = 0; j < 2; j++)
{
for (k = j; k < 3; k++)
{
if (arr[i, j] < arr[i, k])
{
temp = arr[i, j];
arr[i, j] = arr[i, k];
arr[i, k] = temp;
}
}
}
}
for (i = 0; i < 3; i++)//将有序的一维数组作为元素的一维数组排序。也是冒泡。。
for (j = i; j < 4; j++)
{
k=0;
while ((k < 2) && (arr[i, k] == arr[j, k])) k++;
if (arr[i, k] < arr[j, k])
{
for (l = 0; l < 3; l++)
{
temp = arr[i, l];
arr[i, l] = arr[j, l];
arr[j, l] = temp;
}
}
}
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
Console.Write("{0} ", arr[i, j]);
Console.WriteLine();
}
Console.ReadKey();
}
}
}

嘿嘿。。有啥看不懂的可以问我。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-01
#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;
}

当然,整型,浮点型的排序也是这样。

第2个回答  2013-09-03
你首先先针对每一行进行排序,利用嵌套循环,比如(4,78,5)进行循环排序,然后再在另一个维度上,对每一行根据最大值排序,这是我唯一能想到的办法了。
第3个回答  2013-09-03
要C++版本的吗?
相似回答