| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1301 人关注过本帖
标题:为什么经过快速排序后数列还是无序的?
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:100 回复次数:26 
为什么经过快速排序后数列还是无序的?
该问题为合并果子(NOIP2004提高组):
【问题描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将 1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为 12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
【输入文件】
输入文件fruit.in包括两行,第一行是一个整数n(1 <= n <= 10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1 <= ai <= 20000)是第i种果子的数目。
【输出文件】
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
【样例输入】
3
1 2 9
【样例输出】
15
【数据规模】
对于30%的数据,保证有n <= 1000;
对于50%的数据,保证有n <= 5000;
对于全部的数据,保证有n <= 10000。

CODE:
程序代码:
#include <stdio.h>
#include <stdlib.h>
void print(int fruit[],int n)
{
    int i;
    for(i=0;i<n;i++)
    printf("%d ",fruit[i]);
    printf("\n");
}
void Qsort(int fruit[],int startPos,int endPos)
{
    int temp,i,j;
    temp=fruit[startPos];
    i=startPos,j=endPos;
    while(i<j)
    {
    while(temp>=fruit[j]&&i<j)j--;
    fruit[i]=fruit[j];
    while(temp<=fruit[i]&&i<j)i++;
    fruit[j]=fruit[i];
    }
    fruit[i]=temp;
    if(i-1>startPos)Qsort(fruit,startPos,i-1);
    if(startPos>i+1)Qsort(fruit,i+1,endPos);
}
int main()
{
    int fruit[10]={0},n,i,ans=0,length=0,temp=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&fruit[i]);
    length=n;
    Qsort(fruit,0,length);
    for(i=1;i<n;i++)
    {
    temp=fruit[i]+fruit[i-1];
    ans=ans+temp;
    fruit[length]=temp;
    Qsort(fruit,0,length);
    length++;
    }
    printf("%d",ans);
    system("pause");
    return 0;
}



第一次调用Qsort函数排序的时候是可以的,为什么我在for循环调用了Qsort函数,DEBUG里面显示的不是有序数列(Qsort函数没有任何问题)。
我特地把fruit开成10个元素,方便调试。
搜索更多相关主题的帖子: 果子 
2011-01-08 21:38
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
程序里面还写了print函数,方便调用查看

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-08 21:40
xueshukai
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2011-1-7
收藏
得分:0 
看的不太懂,等待提高中。。。
2011-01-08 22:28
phonelong
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-1-8
收藏
得分:0 
没怎么看懂楼主的函数要干什么!但是Qsort(fruit,0,length);是不是有点问题呀!当 输入 1 2 9的时候length=3 fruit[3]=0;多了一个哟!
而且输入 1 2 9的时候经过Qsort排序是9 2 1 0 这个不是求“最小的体力耗费值”这样的排序 再去做下面的运算 应该是求最大消耗吧!
刚开始学习 说得不对的地方 楼主见谅!
2011-01-08 22:32
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:75 
确实如楼上所说,楼主的排序的反了,不过没有关系,将main()改为下面的可以运行成功,并得到正确的结果.我试过了:
int main()
{
    int fruit[10]={0},n,i,ans=0,temp=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&fruit[i]);
    Qsort(fruit,0,n-1);  //假如endpos是数组的最后一个的话,是n-1,用不着length了
    print(fruit,n);  //加上看下排序结果,下同
    for(i=n-1;i>0;i--)  //因为排序的顺序反了,所以从后面开始算起
    {
    temp=fruit[i]+fruit[i-1];
    ans=ans+temp;
    fruit[i]=0;  //合并完归0好一点
    fruit[i-1]=temp;
    Qsort(fruit,0,n-1);  //n的话数组会越界的,上面一处相同
    print(fruit,n);  //同上
    }
    printf("%d\n",ans);
    system("pause");
    return 0;
}


[ 本帖最后由 qq1023569223 于 2011-1-8 23:44 编辑 ]

   唯实惟新 至诚致志
2011-01-08 22:40
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
再说一下,楼主的Qsort()有问题,数一多排序就不正确了。
哎,只要Qsort()没有问题,我上面写的就对了。不过那是楼主的问题了呵。
4楼的问题应该是因为数组越界引起的,我上面改好了。

[ 本帖最后由 qq1023569223 于 2011-1-8 23:56 编辑 ]

   唯实惟新 至诚致志
2011-01-08 23:52
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
Qsort有什么问题?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-09 09:29
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
发现了,原来有一条语句写错了,现在测试一下貌似过了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-09 09:32
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
额,测试都过了,但是有很多超时

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-09 09:39
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
估计要用插入排序

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-09 09:40
快速回复:为什么经过快速排序后数列还是无序的?
数据加载中...
 
   



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

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