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#相关内容感兴趣的读者可查看本站专题:《C#数组操作技巧总结》、《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

您可能感兴趣的文章:

  • C#二维数组基本用法实例
  • C#使用foreach语句遍历二维数组的方法
  • C#实现对二维数组排序的方法
  • c#基础之数组与接口使用示例(遍历数组 二维数组)
  • C#数组排序的两种常用方法
  • C# 数组查找与排序实现代码
  • C#基础之数组排序、对象大小比较实现代码
  • C#实现对数组进行随机排序类实例
  • C#使用linq对数组进行筛选排序的方法
  • C#数组反转与排序实例分析
(0)

相关推荐

  • C#数组排序的两种常用方法

    本文实例讲述了C#数组排序的两种常用方法.分享给大家供大家参考.具体如下: 1.第一个例子 定义代码 #region Array数组排序1 public class Pigeon : IComparable<Pigeon> //类元素本身继承比较接口 { int XValue; int YValue; public string BatchNo { get; set; } public int CompareTo(Pigeon other) { if (other == null) throw

  • C#数组反转与排序实例分析

    本文实例分析了C#数组反转与排序的方法.分享给大家供大家参考.具体实现方法如下: C#数组反转 复制代码 代码如下: using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;    namespace 数据反转  {      class Program      {          static void Main(string[] args)          {    

  • C# 数组查找与排序实现代码

    1. 查找对象 复制代码 代码如下: Person p1 = new Person( " http://www.my400800.cn " , 18 ); Person p2 = new Person( " http://www.my400800.cn " , 19 ); Person p3 = new Person( " http://www.my400800.cn " , 20 ); Person[] persons = ... { p1,

  • C#实现对二维数组排序的方法

    本文实例讲述了C#实现对二维数组排序的方法.分享给大家供大家参考.具体实现方法如下: /// <summary> /// A generic routine to sort a two dimensional array of a specified type based on the specified column. /// </summary> /// <param name="array">The array to sort.</par

  • c#基础之数组与接口使用示例(遍历数组 二维数组)

    一.初始化数组: 复制代码 代码如下: string[] s1 = {"aaa","bbb","ccc"}   //直接赋值string[] s2 = new string[5] {"aaa","bbb","ccc"}; //赋值加指定长度string[] s3 =  new string[]{"aaa","bbb","ccc"

  • C#二维数组基本用法实例

    本文实例讲述了C#二维数组基本用法.分享给大家供大家参考,具体如下: //定义数组 string[,] classes = new string[5, 2]; //正确的C#二维数组使用方法 classes[i, 0] = ""; //错误的使用方法 classes[i][0]=""; 据说这种形式的C#二维数组叫做锯齿数组, 一段例子以供参考: // 声明一个锯齿型数组,该数组有两个元素 int[][] myArray = new int[2][]; // 其中第

  • C#基础之数组排序、对象大小比较实现代码

    从个小例子开始: 复制代码 代码如下: int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i)); 这个例子定义了一个int数组,然后使用Array.Sort(arr)静态方法对此数组进行排序,最后输出排序后的数组.以上例子将毫无意外的依次输出1,2,3,4,5,6. 为什么Array的Sort方法可以正确的对i

  • C#使用linq对数组进行筛选排序的方法

    本文实例讲述了C#使用linq对数组进行筛选排序的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OrderQueryResults { class Program { static void Main(string[] args) { string[] names = {"kaka","kun

  • C#实现对数组进行随机排序类实例

    本文实例讲述了C#实现对数组进行随机排序类.分享给大家供大家参考.具体如下: 这个一个扩充C#随机数发生器的类,可以随机生成指定范围的数字,可以随机对数组进行排序,非常好用 using System; namespace DotNet.Utilities { /// <summary> /// 使用Random类生成伪随机数 /// </summary> public class RandomHelper { //随机数对象 private Random _random; #reg

  • C#使用foreach语句遍历二维数组的方法

    本文实例讲述了C#使用foreach语句遍历二维数组的方法.分享给大家供大家参考.具体分析如下: 如果通过for语句循环遍历二维数组需要两重循环才可以,二foreach语句只需要一次可以完全遍历整个二维数组,下面是代码演示 using System; public class w3demo{ public static void Main() { int sum = 0; int[,] nums = new int[3,5]; // give nums some values for(int i

随机推荐