| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4373 人关注过本帖
标题:对二维数组每行进行快速排序
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:100 回复次数:9 
对二维数组每行进行快速排序
用了论坛的搜索功能,但是并没有查到什么,所以只好再开个新帖,请各位见谅。
问题选自: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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个思路已经实现了,正在研究这种。。。。。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-05 18:19
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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
突然发现输入数据就有些问题

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 18:17
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
终于实现了,但是发现我这个思路无法找到第二大的数,现在想起了拼接数组的方法

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 18:45
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
程序代码:
#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);
}
int main()
{
    long general[500000]={0},n,i,j,m=0,length=0,temp;
    scanf("%ld",&n);
    m=n-1
    for(i=0;i<n-1;i++)
    {
    for(j=0;j<m;j++)
    {
    scanf("%ld",&temp);
    general[length]=temp;
    length++;    
    }
    m--;
    }
    Qsort(general,0,length);
    printf("1");
    printf("%ld",general[1]);
    system("pause");
    return 0;
}


欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 18:59
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
为什么以上代码无法通过编译

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 18:59
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 12楼 BlueGuy
选排估计要超时

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 19:00
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
现在的问题是,为什么上面的程序通不过编译呢。。。。。。。。。   你能帮我看看有什么语法问题吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 19:59
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
sanguo.c: In function `main':
sanguo.c:24: error: syntax error before "for"
sanguo.c:24: error: syntax error before ')' token
sanguo.c:26: error: syntax error before ')' token
sanguo.c:24: warning: statement with no effect
sanguo.c:26: warning: statement with no effect
sanguo.c: At top level:
sanguo.c:32: error: syntax error before '--' token
sanguo.c:34: error: syntax error before numeric constant
sanguo.c:34: warning: type defaults to `int' in declaration of `Qsort'
sanguo.c:34: error: conflicting types for 'Qsort'
sanguo.c:4: error: previous definition of 'Qsort' was here
sanguo.c:34: warning: data definition has no type or storage class
sanguo.c:35: error: syntax error before string constant
sanguo.c:35: warning: type defaults to `int' in declaration of `printf'
sanguo.c:35: error: conflicting types for 'printf'
sanguo.c:35: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
sanguo.c:35: error: conflicting types for 'printf'
sanguo.c:35: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
sanguo.c:35: warning: data definition has no type or storage class
sanguo.c:36: error: syntax error before string constant
sanguo.c:36: warning: type defaults to `int' in declaration of `printf'
sanguo.c:36: warning: data definition has no type or storage class
sanguo.c:37: error: syntax error before string constant
sanguo.c:37: warning: type defaults to `int' in declaration of `system'
sanguo.c:37: warning: data definition has no type or storage class
编译结束但存在 12 错误 和 12 警告

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-07 20:03
快速回复:对二维数组每行进行快速排序
数据加载中...
 
   



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

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