C# double[][] 的排序问题

来源:互联网 发布:java生日祝福程序代码 编辑:程序博客网 时间:2024/06/16 20:33

其实一开始看到double[][]我是很懵圈的,这是个什么玩意儿。不过我试着一步一步用语言去解释它的时候,可以这样理解,用于存放数组的数组。

也就是说,在这个数组中double[0][]的一个元素也是数组。不过闲话不扯了,那么回到问题上来,该怎么排序呢?

假设有如下几个点(1,4), (5,8), (4,2), (7,9), (10,11).我们现在是需要根据Y轴来进行一个排序。

OK,我们先在程序里面,把这个东西抽象出来。如下所示。

var points = new double[][] {                new double[]{ 1,4 },                new double[]{ 5,8 },                new double[]{ 4,2 },                new double[]{ 7,9 },                new double[]{ 10,11 }            };
其实显而易见,在这里我们约定point[0][0]代表点的X坐标,point[0][1]代表点的Y坐标。我们需要看到的结果,是如图所示的。

但是在这个情况中,如果像针对一维数组那样,直接采用各种排序方法不大适用。

OK,那我能不能想到一个办法,没错,就是投票。

首先取出第一个点的Y坐标,然后和其他的几个点分别和第一个点比对,如果小于第一个点的Y坐标则记一分。

那继续取出第二个点的Y坐标,剩余几个又分别和它比对,如果小于第二个点,又分别记一分。

直到最后....分数最多的那个,肯定是最小的.....谈到这里,是不是好像两个for循环就在面前飞了。

下面就是代码....

public static double[][] Sort(double[][] points,int index)        {            var result = new double[points.Length][];//用来返回排序后结果的            var sort = new List<int>();   //用来负责收集积分的,哈哈,谁分多,谁最小            for (int i = 0; i < points.Length; i++) //初始所有积分为0            {                sort.Add(0);            }            //在这里排序了,算积分            for (int i = 0; i < points.Length ; i++)            {                for (int j = 0; j < points.Length ; j++)                {                    if (i != j && points[j][index] > points[i][index])//因为和自己比对是没用的,所以i肯定不能等于j                    {                                                    sort[i] += 1;                                                                   }                }            }            //根据积分然后来重新构造个结果集            for (int i = 0; i < result.Length; i++)            {                result[result.Length - i -1] = points[sort.FindIndex(m => m == i)];            }                        return result;        }
不信邪的可以试试,index是取的1,如上述所说。
但是这里问题来了,坐标点都不一样,那么如果遇到一样的呢?排名会不会出问题。当然,不信的可以自己试试。

在此我就不提会发生什么问题了。那么我们再约定嘛,如果遇到点的Y坐标相同,那么先出来的那个点算是大的,后面那个点是小的。(当然,怎么约定看个人心情和想法)

那么代码如下了。

public static double[][] Sort(double[][] points,int index)        {            var result = new double[points.Length][];            var sort = new List<int>();            for (int i = 0; i < points.Length; i++)            {                sort.Add(0);            }            for (int i = 0; i < points.Length ; i++)            {                for (int j = 0; j < points.Length ; j++)                {                    if (i != j && points[j][index] >= points[i][index])                    {                        if (points[j][index] != points[i][index])                        {                            sort[i] += 1;                        }                        else if (points[j][index] == points[i][index] && i < j)                        {                            sort[i] += 1;                        }                    }                }            }            for (int i = 0; i < result.Length; i++)            {                result[result.Length - i -1] = points[sort.FindIndex(m => m == i)];            }                        return result;        }
Bingo....运行结果,如上图结果所示.....

这样我们自己想办法实现了排序,不过刚才我的朋友给了我一个方法....

points=points.OrderBy(a => a[1]).ToArray();

好像一句就解决了.....不过自己实现嘛,好歹也是有意义和价值的。综上,提供了两种方法。

未经许可,请勿转载哦。亲。

原创粉丝点击