| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3587 人关注过本帖, 7 人收藏
标题:关于昨天和前天写的 冒泡排序和选择排序的测试
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏(7)
已结贴  问题点数:100 回复次数:8 
关于昨天和前天写的 冒泡排序和选择排序的测试
生成10W个随机数据,来进行测试,循环十次,看看我的写法和常见的写法所使用的时间。

为了准确性,两个数组所使用的数据是一模一样的,当然我会放出代码,如果你敢兴趣的话,可以自己运行。

常见的写法是 sort1, 我的写法是 sort2。

先给出选择排序的截图( 截图只有6次对比,但是应该已经能看到差别了 ):

图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ET;
void sort2( ET *array, int l, int r );//我的写法
void sort1( ET *array, int l, int r );//常见的写法 

int main( void )
{
    ET a[ 100000 ], b[ 100000 ];
    ET t;
    int ix, i;
    time_t tm1, tm2;
   
    srand( ( unsigned )time( NULL) );
    printf("sort1 sort2\n");
   
    for( ix = 0; ix < 10; ++ix )
    {
         for( i = 0; i < 100000; ++i )
         {
              t = rand() % 10000;
              a[ i ] = t;
              b[ i ] = t;
         }
        
         tm1 = time( NULL );
         sort1( a, 0, 100000 );
         tm2 = time( NULL );
         printf( "%.2f ", difftime( tm2, tm1 ) );
        
         tm1 = time( NULL );
         sort2( b, 0, 100000 );
         tm2 = time( NULL );
         printf( "%.2f\n", difftime( tm2, tm1 ) );
     }
    return 0;
}

void sort1( ET *array, int l, int r )
{
     ET t;
     int ix, i;
     int min;
    
     for( ix = l;  ix < r; ++ix )
     {
          for( i = ix + 1; i < r; ++i )
               min = array[ ix ] > array[ i ] ? i : ix ;
         
          t = array[ min ];
          array[ min ] = array[ ix ];
          array[ ix ] = t;
      }    
}

void sort2( ET *array, int l, int r )
{
    int minix, maxix;
    ET min, max;
    int i;
    int t;
   
    while( l < r )
    {
        for( minix = l, maxix = l, i = l + 1; i < r; ++i )
        {
            minix = array[ minix ] < array[ i ] ? minix : i;
            maxix = array[ maxix ] > array[ i ] ? maxix : i;
        }
       
        if( minix == r - 1 || maxix == l )
        {
            if( minix == r - 1 )
            {
                t = maxix;
                max = array[ r - 1 ];
                array[ r - 1 ] = array[ maxix ];
                array[ maxix ] = max;
                min = array[ t ];
                array[ t ] = array[ l ];
                array[ l ] = min;
            }
            else
            {
                t = minix;
                min = array[ l ];
                array[ l ] = array[ minix ];
                array[ minix ] = min;
                max = array[ t ];
                array[ t ] = array[ r - 1 ];
                array[ r - 1 ] = max;
            }
        }
        else
        {
            min = array[ l ];
            array[ l ] = array[ minix ];
            array[ minix ] = min;
            max = array[ r - 1 ];
            array[ r - 1 ] = array[ maxix ];
            array[ maxix ] = max;
        }
       
        ++l;
        --r;
    }
}


冒泡排序:

图片附件: 游客没有浏览图片的权限,请 登录注册



程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ET;
void sort2( ET *array, int l, int r );//我的写法
void sort1( ET *array, int l, int r );//常见的写法 

int main( void )
{
    ET a[ 100000 ], b[ 100000 ];
    ET t;
    int ix, i;
    time_t tm1, tm2;
   
    srand( ( unsigned )time( NULL) );
    printf("sort1 sort2\n");
   
    for( ix = 0; ix < 10; ++ix )
    {
         for( i = 0; i < 100000; ++i )
         {
              t = rand() % 10000;
              a[ i ] = t;
              b[ i ] = t;
         }
        
         tm1 = time( NULL );
         sort1( a, 0, 100000 );
         tm2 = time( NULL );
         printf( "%.2f ", difftime( tm2, tm1 ) );
        
         tm1 = time( NULL );
         sort2( b, 0, 100000 );
         tm2 = time( NULL );
         printf( "%.2f\n", difftime( tm2, tm1 ) );
     }
    return 0;
}

void sort1( ET *array, int l, int r )
{
    int i,j;
    ET t;

    for( i = l; i < r; ++i)
        for( j = i + 1; j < r; ++j )
            if( array[ i ] > array[ j ] )
            {
                t = array[ i ];
                array[ i ] = array[ j ];
                array[ j ] = t;
            }
}


void sort2( ET *array, int l, int r )
{
    int minix, maxix;
    int R;
    ET temp;

    for( ; l < r; ++l, --r )
    {
        for( minix = l + 1, maxix = r - 2, R = r - 1; minix <= R; ++minix, --maxix )
        {
            if( array[ l ] > array[ minix ] )
            {
               
                temp = array[ l ];
                array[ l ] = array[ minix ];
                array[ minix ] = temp;
            }
            if( array[ R ] < array[ maxix ] )
            {

                temp = array[ R ];
                array[ R ] = array[ maxix ];
                array[ maxix ] = temp;
            }
        }
    }
}



搜索更多相关主题的帖子: time int array for min 
2017-08-22 11:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:34 
做得好啊~先收藏了~以后慢慢看~

补充一下哈~其实这性质有点像归并排序的二分法思想 分的区间等于分成两个区间排序~这速度当然快一倍了~如果分成4个还会再快~~

[此贴子已经被作者于2017-8-22 12:45编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-08-22 12:42
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 九转星河
没那么快,不到一倍。


[此贴子已经被作者于2017-8-22 22:45编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-08-22 22:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 renkejun1942
是的,如果用归并排序分成两个区间还有一个区间合并的过程,所以实际上也没有传统的两倍那么快~这个也是类似的。还有实际上循环次数多少还不好定义呢,++minix,--maxix这样算是1次还是两次?~感觉1次两次都有一定的道理~

总之一般情况下这当然比传统排序的速度要快~

[此贴子已经被作者于2017-8-23 06:09编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-08-23 06:08
zjh282984204
Rank: 2
等 级:论坛游民
帖 子:2
专家分:34
注 册:2017-8-23
收藏
得分:34 
以后慢慢看,现在才入门
2017-08-23 17:39
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:34 
顶一个哈哈
2017-08-24 09:52
孤狼number1
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-9-13
收藏
得分:0 
2017-09-13 08:35
两切
Rank: 2
等 级:论坛游民
帖 子:10
专家分:14
注 册:2017-4-2
收藏
得分:0 
回复 2楼 九转星河
同上
2017-09-21 07:42
那个学者
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2017-8-24
收藏
得分:0 
你的程序牺牲资源,节约时间;前面的那个节省资源,加大了时间,两者不可兼得
2017-11-29 10:09
快速回复:关于昨天和前天写的 冒泡排序和选择排序的测试
数据加载中...
 
   



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

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