主题:求数组排序思路?
leolhc
[专家分:430] 发布于 2006-09-30 17:26:00
有一个MxN的数组,按以下要求排序:每行的元素从大到小排列;偶数列的元素从大到小排列,奇数列的元素从小到大排列。
我对每行先进行排列,然后再对奇数列和偶数列按要求排序,但结果却不能达到题设的要求;反过来,先排列列,再排列行,也无法达到要求,不知道应该怎么排列呢?
回复列表 (共12个回复)
沙发
leolhc [专家分:430] 发布于 2006-09-30 17:53:00
现在想到一个思路,用一个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++)
{一维数组逐个赋值给原数组}
}
请高人给出更好的思路,谢谢。
板凳
argentmoon [专家分:13260] 发布于 2006-09-30 22:29:00
按你那样排之后会出问题的。原来的序会打乱,打乱之后又需要重排,就分不清楚了。
提供一种思路,观察一下这个数组,我用箭头表示大于号(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 楼
leolhc [专家分:430] 发布于 2006-10-01 23:39:00
2楼你的思路跟我在1楼里面的是一样的呀。
按照这样一条路走,需要一个O(m*n)大小的一维数组作为辅助存储空间,不知道你有没有不需要这个辅助空间的算法?
4 楼
argentmoon [专家分:13260] 发布于 2006-10-02 00:10:00
[quote]3楼你的思路跟我在2楼里面的是一样的呀。
按照这样一条路走,需要一个O(m*n)大小的一维数组作为辅助存储空间,不知道你有没有不需要这个辅助空间的算法?[/quote]
不一样。
你那样是排不出来的。
排好的序会打乱掉。
5 楼
oaiei [专家分:1490] 发布于 2006-10-02 00:31:00
赞2楼的。
就是如果存在那样的矩阵的话。
2楼写出的关系式就成立,也就是说排完序填回去,并没有打乱行列关系。
也就是你要求的那个矩阵。
6 楼
leolhc [专家分:430] 发布于 2006-10-02 00:33:00
那可能是我没表达清楚,反正我的思路跟你在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 楼
argentmoon [专家分:13260] 发布于 2006-10-02 00:45:00
很抱歉,开始确实没怎么看清楚一楼的解法,是一样的。
至于不用辅助空间的方法倒是没有想出来。
8 楼
leolhc [专家分:430] 发布于 2006-10-02 00:49:00
呵呵,还是要谢谢你的热心参与!
9 楼
雨523 [专家分:200] 发布于 2006-10-02 08:05:00
这都成魔方了
10 楼
dorremon1992 [专家分:870] 发布于 2006-10-02 19:17:00
先选一种算法 就比如说是 快排 吧
然后把数组看成两个就是了
根据数学方法动态的求出数组下标
我来回复