| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4373 人关注过本帖
标题:对二维数组每行进行快速排序
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:100 回复次数:19 
对二维数组每行进行快速排序
用了论坛的搜索功能,但是并没有查到什么,所以只好再开个新帖,请各位见谅。
问题选自:http://www.(NOIP2010普及组第四题)  ,本题看起来很复杂,但是仔细看看却是选择第二大的数,思路就是把每行排序,直接选择第二个。
但是写了代码后无法给数组每行排序:(加了打印函数,方便调试)。
程序代码:
#include <stdio.h>
#include <stdlib.h>
void Qsort(long general[500][500],long startPos,long endPos,long n)//m为当前元素个数,n为记录当前列数,startPos为开始元素,endPos为结束元素
{
    long temp=general[n][0],i,j;
    i=startPos,j=endPos;
    while(i<j)
    {
    while(temp>=general[n][j]&&i<j)j--;
    general[n][i]=general[n][j];
    while(temp<=general[n][i]&&i<j)i++;
    general[n][j]=general[n][i];
    }
    general[n][i]=temp;
    if(i-1>startPos)Qsort(general,startPos,i-1,n);
    if(endPos>i+1)Qsort(general,i+1,endPos,n);
}
void print(long general[500][500],long n)
{
    long i,j;
    for(i=0;i<n-1;i++)
    {
        printf("\n");
        for(j=0;j<n-1;j++)
        printf("%d ",general[i][j]);
    }
    printf("\nOK!\n");
}
int main()
{
    long general[500][500],i,j,n,m=0;
    memset(general,0,sizeof(general[0][0]));
    scanf("%ld",&n);
    m=n-1;//记录列数
    for(i=0;i<n-1;i++)
    for(j=i;j<n-1;j++)
    {
    scanf("%ld",&general[i][j]);
    general[j][i]=general[i][j];
    }
    print(general,n);
    for(i=0;i<n-1;i++)//增加列数,对每行进行排序
    {
    Qsort(general,0,m,i);
    m--;
    }
    print(general,n);
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: 二维 快速 
2011-01-05 17:37
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:30 
你先写个对一维数组的,然后分别调用n次不就行了吗?
调用时general改general[i]
函数内的[n]就多余了,去掉吧

樱之雪,晓之车
2011-01-05 17:44
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个思路已经实现了,正在研究这种。。。。。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-05 18:19
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
不是完全没区别么?何必非要多加个[n]来为难自己呢?反而导致产生了难以查找的BUG,我是觉得很不解
真要解决的话,从一个已经是正确的qsort函数来改,改参数,改访问,这样就应该能保证正确了

樱之雪,晓之车
2011-01-05 18:46
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
来学习的.

   唯实惟新 至诚致志
2011-01-05 22:40
xufan123
Rank: 5Rank: 5
等 级:职业侠客
帖 子:226
专家分:318
注 册:2010-11-15
收藏
得分:0 
看看
2011-01-05 23:04
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 4楼 马后炮
按照你的思路写的,但是发现了一些很奇怪的问题:
程序代码:
#include <stdio.h>
#include <stdlib.h>
void Qsort(long general[],long startPos,long endPos)
{
    long temp,i,j;
    temp=general[startPos];
    i=startPos,j=endPos;
    while(i<j)
    {
    while(temp>=general[j]&&i<j)j--;
    general[i]=general[j];
    while(temp<=general[i]&&i<j)i++;
    general[j]=general[i];
    }
    general[i]=temp;
    if(i-1>startPos)Qsort(general,startPos,i-1);
    if(endPos>i+1)Qsort(general,i+1,endPos);
}
void get_zero(long general[],long n)
{
    long i;
    for(i=0;i<n;i++)
    general[i]=0;
}
void print(long general[],long m)
{
    long i;
    printf("\n");
    for(i=0;i<m;i++)
    printf("%ld ",general[i]);
    printf("\n");
}
int main()
{
    long general[500]={0},n,i,j,m=0;
    scanf("%ld",&n);
    m=n-1;
    for(i=0;i<n-1;i++)
    {
    for(j=i;j<n-1;j++)
    scanf("%ld",&general[j]);
    Qsort(general,0,m);
    print(general,m);
    m--;
    }
    system("pause");
    return 0;
}

你测试一下,发现一个很奇怪的现象。
给你个测试数据:
6
5 28 16 29 27
23 3 20 1
8 32 26
33 11
12

输出应是每行从大到小排序,但是会发生很奇怪的问题。你看看

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-06 18:27
shafeilong
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:236
专家分:1434
注 册:2009-3-21
收藏
得分:5 
呵呵   我只想到qsort
2011-01-06 18:29
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
突然发现输入数据就有些问题

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 18:17
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:18 




                                    占位置来学习
2011-01-07 18:20
快速回复:对二维数组每行进行快速排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030905 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved