本文实例讲述了C#实现的二维数组排序算法。分享给大家供大家参考,具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
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
15
16
17
18
19
20
21
|
没排序前的二维数组: 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