回 帖 发 新 帖 刷新版面

主题:求数组排序思路?

有一个MxN的数组,按以下要求排序:每行的元素从大到小排列;偶数列的元素从大到小排列,奇数列的元素从小到大排列。

我对每行先进行排列,然后再对奇数列和偶数列按要求排序,但结果却不能达到题设的要求;反过来,先排列列,再排列行,也无法达到要求,不知道应该怎么排列呢?

回复列表 (共12个回复)

沙发

现在想到一个思路,用一个m*n的一维数组保存原数组的数据并把一维数组排序。然后按照之字型给原数组赋值。
for (j=1;j<n+1;n++)
{
  if (j%2==1)  //奇数列
    for (i=m;i>0;i--)  
    {一维数组逐个赋值给原数组}
  else  //偶数列
    for (i=1;i<m+1;i++) 
    {一维数组逐个赋值给原数组}
}

请高人给出更好的思路,谢谢。

板凳

按你那样排之后会出问题的。原来的序会打乱,打乱之后又需要重排,就分不清楚了。

提供一种思路,观察一下这个数组,我用箭头表示大于号(4×4的矩阵),那么如果排好序之好,将会是这个样子的:
      a[1,1]  ->  a[1, 2]  ->  a[1, 3]  ->  a[1, 4]
        ↑           ↓           ↑           ↓
      a[2,1]  ->  a[2, 2]  ->  a[2, 3]  ->  a[2, 4]
        ↑           ↓           ↑           ↓
      a[3,1]  ->  a[3, 2]  ->  a[3, 3]  ->  a[3, 4]
        ↑           ↓           ↑           ↓
      a[4,1]  ->  a[4, 2]  ->  a[4, 3]  ->  a[4, 4]

观察箭头的走向,比较容易找出这么一条路就是
a[4,1] -> a[3,1] ... -> a[1,1] ->
a[1,2] -> a[2,2] ... -> a[4,2] ->
a[4,3] -> a[3,3] ... -> a[1,3] ->
a[1,4] -> a[2,4] ... -> a[4,4]

就条路就是一条有序(从大到小)的路,你可以把数组里面的所有的元素排好序之后,从大到小填到这条路里面就可以了。

3 楼

2楼你的思路跟我在1楼里面的是一样的呀。
按照这样一条路走,需要一个O(m*n)大小的一维数组作为辅助存储空间,不知道你有没有不需要这个辅助空间的算法?

4 楼

[quote]3楼你的思路跟我在2楼里面的是一样的呀。
按照这样一条路走,需要一个O(m*n)大小的一维数组作为辅助存储空间,不知道你有没有不需要这个辅助空间的算法?[/quote]

不一样。
你那样是排不出来的。
排好的序会打乱掉。

5 楼

赞2楼的。

就是如果存在那样的矩阵的话。

2楼写出的关系式就成立,也就是说排完序填回去,并没有打乱行列关系。

也就是你要求的那个矩阵。

6 楼

那可能是我没表达清楚,反正我的思路跟你在2楼的是一样的,之字型就是你画的下面这个东西
      a[1,1]  ->  a[1, 2]      a[1, 3]  ->  a[1, 4]
        ↑           ↓           ↑           ↓
      a[2,1]      a[2, 2]      a[2, 3]      a[2, 4]
        ↑           ↓           ↑           ↓
      a[3,1]      a[3, 2]      a[3, 3]      a[3, 4]
        ↑           ↓           ↑           ↓
      a[4,1]      a[4, 2]  ->  a[4, 3]      a[4, 4]
我那段程序是将已经排好队的一维数组赋值给原数组的。
不过不知道你有没有不需O(m*n)辅助空间的算法。

7 楼

很抱歉,开始确实没怎么看清楚一楼的解法,是一样的。

至于不用辅助空间的方法倒是没有想出来。

8 楼

呵呵,还是要谢谢你的热心参与!

9 楼

这都成魔方了

10 楼

先选一种算法 就比如说是 快排 吧
  然后把数组看成两个就是了
  根据数学方法动态的求出数组下标

我来回复

您尚未登录,请登录后再回复。点此登录或注册