| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1010 人关注过本帖
标题:问个问题..
只看楼主 加入收藏
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
upper越界了。
upper = size - 1;

2006-08-27 23:51
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

晕,我的程序也只是扫描一遍数组而已,为什么会比sun学长的慢呢?


对不礼貌的女生收钱......
2006-08-28 13:13
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
加大数组,每种方法重复运行10000次,再看看谁的时间短。这才是真正效率

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-28 13:44
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用woodhead在2006-8-27 23:41:45的发言:
[CODE]#include<cstdio>

void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

void sort(int a[], int size)
{
int lower = 0, upper = size;
while( lower <= upper)
{
while(lower<upper && a[lower]%2==1)
lower++;
while(lower<upper && a[upper]%2==0)
upper--;
if(lower < upper)
Swap(&a[lower++], &a[upper--]);
else
lower++;
}
}

int main()
{
int a[10]={2,1,3,9,7,8,6,3,4,0};
sort(a,10);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
}[/CODE]

这个复杂度是多少,三个while




怎么长的很像俺写的那个partition()函数呀。


http://myajax95./
2006-08-28 13:48
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
两个复杂度一样都是O(N)。谁快取决于单词操作谁的更浪费时间,不过没多大差别。这本来就是个O(N)的解,多讨论没什么意义。

http://myajax95./
2006-08-28 13:55
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
借鉴借鉴。


2006-08-28 13:57
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用baidu在2006-8-28 13:44:56的发言:
加大数组,每种方法重复运行10000次,再看看谁的时间短。这才是真正效率

我用了两重循环,外层1000次,内层10000次,我的函数是45ms,sun学长的是69ms,哈哈。他这次傻了
主函数如下:
#include "time.h"
#include "conio.h"
int main()
{

int time1=0,time2;
int i;
unsigned long one,two;
one=clock();
for(;time1<1000;time1++)
for(time2=0;time2<10000;time2++)
{
int a[SIZE]={1,2,3,4,5,6,7,8,9,10};
sort(a,SIZE);
}
two=clock();
printf("%f\n",(two-one)/1000.);
getch();
}
测试是在wtc下运行的,我的电脑是win xp professional.T2300/1G


对不礼貌的女生收钱......
2006-08-28 14:03
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用myajax95在2006-8-28 13:55:48的发言:
两个复杂度一样都是O(N)。谁快取决于单词操作谁的更浪费时间,不过没多大差别。这本来就是个O(N)的解,多讨论没什么意义。

说的是,可他非说两个for的效率就差些,哈哈。


对不礼貌的女生收钱......
2006-08-28 14:04
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
明显是2个for的那个程序快!!
就拿int a[SIZE]={1,2,3,4,5,6,7,8,9,10};为例
一个for的程序在排序中数组的变化情况为:
1 2 3 4 5 6 7 8 9 10
1 3 2 4 5 6 7 8 9 10
1 3 2 10 5 6 7 8 9 4
1 3 5 10 2 6 7 8 9 4
1 3 5 10 2 9 7 8 6 4
1 3 5 9 2 10 7 8 6 4
1 3 5 9 7 10 2 8 6 4
1 3 5 9 7 10 2 8 6 4
1 3 5 9 7 10 6 8 2 4
1 3 5 9 7 4 6 8 2 10
就拿数字‘2’的位置来说就变化了4次,明显效率低下!

而2个for的那个程序,数组的变化情况为:
1 9 3 4 5 6 7 8 2 10
1 9 3 7 5 6 4 8 2 10
仅用2次交换就完成了!!!
而1个for的那个程序用了10次交换,其中有大量的无用操作,数字在数组中跳来跳去有什么用。而且程序的可读性也差。

在复杂度上,两个程序都是O(n),但1个for的那个程序有大量的无用交换!



2006-08-28 14:57
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用SunShining在2006-8-27 22:23:06的发言:
#include<stdio.h>
#define SIZE 10
void sort(int *a,int n)
{
for(int i=0,fi=0,se=n>3?n-1:n-2;i<n;i++)
{
if(i!=fi&&a[i]%2==0){int tem=a[se];a[se]=a[i],a[i]=tem,se--;}
if(i!=se&&a[i]%2==1){int tem=a[fi];a[fi]=a[i],a[i]=tem,fi++;}
}
}
int main()
{
int a[SIZE]={1,2,3,4,5,6,7,8,9,10};
sort(a,SIZE);
for(int i=0;i<SIZE;i++)
printf("%d ",a[i]);
}

把tem定义在){int tem=a[se];a[se]=a[i],a[i]=tem,se--;}中也是程序慢的另一个原因,这样虽然便于数据的隐蔽.但tem空间频繁的申请和释放(每交换一次数据,就要申请一次空间),必然浪费大量的时间.本人觉得可以把int tem放在函数的开始.


2006-08-28 15:34
快速回复:问个问题..
数据加载中...
 
   



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

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