本文实例讲述了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 45 6 7 89 10 11 1213 14 11 1215 16 11 175 6 7 9根据第3,4列升序排序后的数组:1 2 3 45 6 7 85 6 7 913 14 11 129 10 11 1215 16 11 17根据第3,4列降序序排序后的数组:15 16 11 179 10 11 1213 14 11 125 6 7 95 6 7 81 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#数组反转与排序实例分析