C#实现的二维数组排序算法示例
作者:xuanfeng 发布时间:2023-01-05 20:23:07
标签:C#,二维数组,排序算法
本文实例讲述了C#实现的二维数组排序算法。分享给大家供大家参考,具体如下:
class Order
{
/// <summary>
/// 对二维数组排序
/// </summary>
/// <param name="values">排序的二维数组</param>
/// <param name="orderColumnsIndexs">排序根据的列的索引号数组</param>
/// <param name="type">排序的类型,1代表降序,0代表升序</param>
/// <returns>返回排序后的二维数组</returns>
public static object[,] Orderby(object[,] values, int[] orderColumnsIndexs, int type)
{
object[] temp = new object[values.GetLength(1)];
int k;
int compareResult;
for (int i = 0; i < values.GetLength(0); i++)
{
for (k = i + 1; k < values.GetLength(0); k++)
{
if (type.Equals(1))
{
for (int h = 0; h < orderColumnsIndexs.Length; h++)
{
compareResult = Comparer.Default.Compare(GetRowByID(values, k).GetValue(orderColumnsIndexs[h]), GetRowByID(values, i).GetValue(orderColumnsIndexs[h]));
if (compareResult.Equals(1))
{
temp = GetRowByID(values, i);
Array.Copy(values, k * values.GetLength(1), values, i * values.GetLength(1), values.GetLength(1));
CopyToRow(values, k, temp);
}
if (compareResult != 0)
break;
}
}
else
{
for (int h = 0; h < orderColumnsIndexs.Length; h++)
{
compareResult = Comparer.Default.Compare(GetRowByID(values, k).GetValue(orderColumnsIndexs[h]), GetRowByID(values, i).GetValue(orderColumnsIndexs[h]));
if (compareResult.Equals(-1))
{
temp = GetRowByID(values, i);
Array.Copy(values, k * values.GetLength(1), values, i * values.GetLength(1), values.GetLength(1));
CopyToRow(values, k, temp);
}
if (compareResult != 0)
break;
}
}
}
}
return values;
}
/// <summary>
/// 获取二维数组中一行的数据
/// </summary>
/// <param name="values">二维数据</param>
/// <param name="rowID">行ID</param>
/// <returns>返回一行的数据</returns>
static object[] GetRowByID(object[,] values, int rowID)
{
if (rowID > (values.GetLength(0) - 1))
throw new Exception("rowID超出最大的行索引号!");
object[] row = new object[values.GetLength(1)];
for (int i = 0; i < values.GetLength(1); i++)
{
row[i] = values[rowID, i];
}
return row;
}
/// <summary>
/// 复制一行数据到二维数组指定的行上
/// </summary>
/// <param name="values"></param>
/// <param name="rowID"></param>
/// <param name="row"></param>
static void CopyToRow(object[,] values, int rowID, object[] row)
{
if (rowID > (values.GetLength(0) - 1))
throw new Exception("rowID超出最大的行索引号!");
if (row.Length > (values.GetLength(1)))
throw new Exception("row行数据列数超过二维数组的列数!");
for (int i = 0; i < row.Length; i++)
{
values[rowID, i] = row[i];
}
}
}
static void Main(string[] args)
{
object[,] o = new object[6, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 11, 12 }, { 15, 16, 11, 17, }, { 5, 6, 7,9 } };
Console.WriteLine("没排序前的二维数组:");
Print(o);
Console.WriteLine("根据第3,4列升序排序后的数组:");
Order.Orderby(o, new int[] { 2,3 },0);
Print(o);
Console.WriteLine("根据第3,4列降序序排序后的数组:");
Order.Orderby(o, new int[] { 2, 3 }, 1);
Print(o);
Console.Read();
}
static void Print(object[,] values)
{
int k;
for (int i = 0; i < values.GetLength(0);i++ )
{
for (k = 0; k < values.GetLength(1);k++ )
{
Console.Write(values[i,k]);
Console.Write(" ");
}
Console.WriteLine(" ");
}
}
运行结果:
没排序前的二维数组:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 11 12
15 16 11 17
5 6 7 9
根据第3,4列升序排序后的数组:
1 2 3 4
5 6 7 8
5 6 7 9
13 14 11 12
9 10 11 12
15 16 11 17
根据第3,4列降序序排序后的数组:
15 16 11 17
9 10 11 12
13 14 11 12
5 6 7 9
5 6 7 8
1 2 3 4
希望本文所述对大家C#程序设计有所帮助。
来源:http://www.cnblogs.com/xuanfeng/archive/2008/11/20/1334636.html
0
投稿
猜你喜欢
- 一、网络爬虫的基本知识网络爬虫通过遍历互联网络,把网络中的相关网页全部抓取过来,这体现了爬的概念。爬虫如何遍历网络呢,互联网可以看做是一张大
- 如下所示:public static String reThreeStr(String ss){boolean result= ss.mat
- 简介CAS的原理其实很简单,为了保证在多线程环境下我们的更新是符合预期的,或者说一个线程在更新某个对象的时候,没有其他的线程对该对象进行修改
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- 1. Mybatis JdbcType与Oracle、MySql数据类型对应列表MybatisJdbcTypeOracleMySqlJdbc
- 概述java移位符主要包括3种:运算符名称>>左移运算符<<有符号右移运算符<<<无符号右移运算符
- 这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 1. Ajax 概述Ajax 的英文全称是 ”Asynchronous JavaScript and XML&l
- 前言JDK 1.5 之前 synchronized 的性能是比较低的,但在 JDK 1.5 中,官方推出一个重量级功能 Lock,一举改变了
- SpringMVC @RequestBody的使用Spring mvc是一个非常轻量的mvc框架,注解可以大大减少配置,让请求的拦截变得比较
- Java获取控制台输入的方法在学习网络编程中,有需要从控制台输入数据,进行两个线程之间的通信,其中,涉及到了读取控制台输入的两种不同的操作,
- 一、点睛邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个二维数组存储图中节点之间的邻接关系。邻接矩阵可以用来表示无向图、有向图和网。
- 限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速
- java web 实现分页功能,分享给大家,具体如下:使用框架:ssm数据库:oracle话说 oracle 的分页查询比 mysql 复杂
- springcloud-gateway集成knife4j环境信息环境信息spring-boot:2.6.3spring-cloud-alib
- 本文为大家分享了如何使用eclipse创建java项目,供大家参考,具体内容如下首先,打开Eclipse,在工具栏依次点击【File】>
- java 中newInstance()方法和new关键字的区别* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新
- 本篇给大家详细讲解了MTKAndroid平台开发流程,大致分为44个步骤,我们把每个步骤的命令详细讲解了下,一起来学习下。1.拷贝代码仓库从
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
- 一、前期准备我们要在IDEA上创建一个新的项目,创建好一个项目后,我们需要创建4个包,分别是英雄包,装备包,铭文包,野怪包,皮肤包然后我们就