求一个二维数组的排序算法. 
    
    有这样一个二维数组。如:  (1,2), (1,3), (2,4), (2,6), (3,5), (4,7) 
        排序后的结果为      (1,2), (2,4), (4,7), (2,6), (1,3), (3,5) 
  算法规则如下:数组值用(a,b)代替 
    1.找到数组中第一个字段a为最小值的元素。上例中的(1,2),(1,3) 
    2.依次取得之前回合找到的元素。上例中先去(1,2) 再区(1,3) 
    3.找出数组中第一个字段a中与之前取到的元素中的字段b相等的元素。 上例中的(2,4), (2,6)     循环2,3直到排序完成 上例中将会找到(4,7),把这个元素排再(2,4)之后 。因为(4,7)中的4等于(2,4)中的4. 小弟表达能力有限。不知道描述清楚没有。总之就是两个元素比较,如果第二个元素的第一个数值与第一个元素的第二个数值相等就将他们排到一起。
我知道用冒泡法可以实现,但是具体程序不清楚怎么写?希望帮忙写个c#版本的方法。
    

解决方案 »

  1.   

    不知道楼主想做什么?给你代码参考一下.        int[,] aa = new int[,]{{4,7},{1,2}, {1,3}, {2,4}, {2,6}, {3,5} };        int[,] bb = new int[6,2] ;        for (int i=0; i < 6; i++)
            {            for (int j = i+1; j < 6; j++)
                {
                    if (aa[i, 0] > aa[j, 0])
                    {
                        bb[0,0] = aa[j, 0];
                        bb[0, 1] = aa[j, 1];
                        aa[j, 0] = aa[i, 0];
                        aa[j, 1] = aa[i, 1];
                        aa[i, 0] = bb[0,0];
                        aa[i, 1] = bb[0, 1];
                    }
                }
            }        for (int i = 0; i < 6; i++)
            {
                for (int j = i + 1; j < 6; j++)
                {
                    if (aa[j, 0] == aa[i, 1])
                    {
                        bb[0, 0] = aa[j, 0];
                        bb[0, 1] = aa[j, 1];
                        for (int k = j; k > i; k--)
                        {
                            aa[k, 0] = aa[k - 1, 0];
                            aa[k, 1] = aa[k - 1, 1];
                        }
                        aa[i + 1, 0] = bb[0, 0];
                        aa[i + 1, 1] = bb[0, 1];
                    }
                }
            }
      

  2.   

    谢谢lonelygames ,你的方法很好,我举了很多例子测试了,返回的结果都是对的。(先分你70分,结贴时结算)
      不过小弟还有一个需求忘记说了,就是还有一个大小排序的问题。比如你的例子{4,7},{1,2}, {1,3}, {2,4}, {2,6}, {3,5}最后返回值是{1,2},{2,6}, {2,4}, {4,7}, {1,3}, {3,5}  这里我希望{2,6}再{4,7}的后面  又假如我改变上例{1,2},{1,3}的位置  
    变成{4,7},{1,3}, {1,2}, {2,4}, {2,6}, {3,5}  得到的结果是
    {1,3}, {3,5},{1,2},{2,6}, {2,4}, {4,7}  这里后面的数据就跑前面去了  本帖还有30分希望各位先辈多给些意见,   小弟想知道的并不只是算法结果。
         我更希望先辈们能提供分析方法。  之前小弟本来用冒泡法写过一个算法,但是不全面,出了错误。
      

  3.   

    这个问题我已考虑到了,想说的,但看你的需求里没有,所以没写.其它再加一个条件就实现了.
               for (int j = i+1; j < 6; j++)
                {
                    if (aa[i, 0] > aa[j, 0])
                    {
                        bb[0,0] = aa[j, 0];
                        bb[0, 1] = aa[j, 1];
                        aa[j, 0] = aa[i, 0];
                        aa[j, 1] = aa[i, 1];
                        aa[i, 0] = bb[0,0];
                        aa[i, 1] = bb[0, 1];
                    }
                    if (aa[i,0] == aa[j,0] and aa[i,1]>aa[j,1])
                    {
                        bb[0,0] = aa[j, 0];
                        bb[0, 1] = aa[j, 1];
                        aa[j, 0] = aa[i, 0];
                        aa[j, 1] = aa[i, 1];
                        aa[i, 0] = bb[0,0];
                        aa[i, 1] = bb[0, 1];
                    }
    .....