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

其实一开始看到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();

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值