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

原文地址:https://www.cnblogs.com/wt88/p/12090892.html

时间: 2024-11-07 10:33:22

C# 实现二维数组的排序算法(代码)的相关文章

二维数组的排序

1 result =[['7250','1'],['7510','2'],['7759','0'],['6523','33']] 2 3 copy_result = [] 4 5 for item in result: 6 copy_result.append([int(item[0]),item[1]]) 7 8 print result 9 # output: 10 # [['7250', '1'], ['7510', '2'], ['7759', '0'], ['6523', '33']]

php二维数组自定义排序

PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义. 以下函数是对一个给定的二维数组按照指定的键值进行排序,先看函数定义: function array_sort($arr,$keys,$type='asc'){ $keysvalue = $new_array = array(); foreach ($arr as $k=>$v){ $keysvalue[$k] = $v[$keys]; } if($type == 'asc'){

php 二维数组自定义排序

有时候需要对一个二维数组进行排序,自定义对应的排序规则,比如对一个班级里面的同学,先按身高降序排序,身高相同的,再按体重降序排序... 代码: <?php $array = [ ["id" => "1", "name" => "a", "age" => "19",], ["id" => "2", "name&

二维数组元素排序

<script type="text/javascript">//--------------------------1数值排序-------------------------var arr1=[[22,33,44],[1,0,6,2],[33,10],[10,5]];arr1.sort(function(x,y){ return x[1] -y[1];//按照二维数组arr1中每个数组元素(数组)的第二个元素升序排列 });console.log(arr1); //--

二维数组sort排序

和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不会,sad. 在想要不要把分治 贪心 递推 哈希 大根小根堆再看一遍,我似乎又忘了. 刘神刷题比我快了,我应该好好学习不能这么浪. 大概我永远没有大神们的智商优势吧,所以要更努力. 毕竟没有贯彻意志的希望一无所有,所以努力成为hal一样的绿灯侠吧少年[bushi]. 好了回归正题. 要想知道二维数组

qsort对二维数组的排序

转自 :http://blog.csdn.net/slience_perseverance/article/details/6695048 qsort对二维数组排序与对以为数组排序是一样的几乎没有什么差别,而且后来想想定义一个二维数组所占的空间与定义一个机构体所占的空间是一样 的,所以没有必要用多维数组,直接用结构体数组就行. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math

改变二维数组大小的算法问题

o4tlog趁战斯吧禄谌<http://weibo.com/Pp/230927983062485022019584> crhusv橙汤莆喝制瓷<http://weibo.com/Pp/230927983068918417461248> sczaja赶咆攘堆碳坛<http://weibo.com/20180411pp/230927983122666732920832> i2ovb7姑澄河举貉断<http://weibo.com/p755p458p/230927983

删除数组与二维数组值的php代码

方法如下: $arr = array(…………) ;//假设有一万个元素的数组,里面有重复的元素. $arr = array_flip(array_flip($arr)); //这样便可以删除重复元素. 究竟是怎么回事呢?来看下array_flip()的作用:array_flip()用于将一个数组的每个元素的键和值交换,如: $arr1 = array (”age” => 30, “name” => “快乐园”); $arr2 = array_flip($arr1); //$arr2 就是 a

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体