C#实现的二维数组排序算法示例

作者:xuanfeng 时间:2023-01-05 20:23:07 

本文实例讲述了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

标签:C#,二维数组,排序算法
0
投稿

猜你喜欢

  • C#操作XML文件实例汇总

    2023-03-26 03:55:08
  • Android ImageView绘制圆角效果

    2023-11-22 22:59:15
  • Unity利用材质自发光实现物体闪烁

    2021-07-03 20:42:26
  • Java枚举学习之定义和基本特性详解

    2022-07-23 20:29:44
  • SpringBoot详细讲解静态资源导入的实现

    2023-07-26 13:23:21
  • Java加载资源文件时的路径问题的解决办法

    2023-05-09 23:22:40
  • Unity实现VR中在黑板上写字效果

    2021-08-04 20:11:11
  • Android实现京东App分类页面效果

    2023-05-07 02:53:49
  • spring boot项目打包成war在tomcat运行的全步骤

    2023-12-17 19:20:36
  • Java实现UDP多线程在线咨询

    2022-08-30 13:15:08
  • Android中ActionBar以及menu的代码设置样式

    2023-11-24 03:34:33
  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    2023-08-08 14:38:37
  • Java 实战项目之仓库管理系统的实现流程

    2021-10-05 09:14:07
  • Java PDF 添加数字签名的实现方法

    2022-01-03 04:05:56
  • MyBatis通过JDBC数据驱动生成的执行语句问题

    2023-08-24 08:42:18
  • 解析C#拼接Json串的几种方法

    2021-12-28 20:22:48
  • Unity TextMeshPro实现富文本超链接默认字体追加字体

    2021-10-13 23:57:24
  • springBoot集成Elasticsearch 报错 Health check failed的解决

    2022-12-07 05:18:16
  • c#语言程序构建基块

    2023-04-11 22:40:12
  • JDK8中的HashMap初始化和扩容机制详解

    2023-11-25 10:06:44
  • asp之家 软件编程 m.aspxhome.com