| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10373 人关注过本帖
标题:对同一列数据用各种排序法来统计分别各自交换了多少次,来比较用哪种方法交 ...
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 36楼 九转星河
跳出循环我以前写冒泡的时候就考虑了,只是没实现,因为一个简单的例子就能狠狠的打脸。

{0,2,3,6,7,8,1,4,5,9}

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 11:30
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:5 
回复 38楼 renkejun1942
程序代码:
void sort( E_T *array, int l, int r )
{
    int minix, maxix;
    int R;
    int c;
    
    c=0;

    for( ; l < r; ++l, --r )
    {
        int mask = 1;
        for( minix = l + 1, maxix = r - 2, R = r - 1; minix <= R; ++minix, --maxix )
        {
            if( array[ l ] > array[ minix ] )
            {
                mask = 0;
                c++;
                E_T temp = array[ l ];
                array[ l ] = array[ minix ];
                array[ minix ] = temp;
            }
            if( array[ R ] < array[ maxix ] )
            {
                mask = 0;
                c++;
                E_T temp = array[ R ];
                array[ R ] = array[ maxix ];
                array[ maxix ] = temp;
            }
        }
        if(mask)
            break;
    }
    
    printf("jiao huan %d ci",c);
    
}

比如万能的 mask

=========================
好吧 不行

[此贴子已经被作者于2018-5-24 11:33编辑过]


https://zh.
2018-05-24 11:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 42楼 lin5161678
考虑楼上的例子。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 11:31
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
要跳出循环,我的想法是加一次遍历,但是这样的后果是效率不稳定。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 11:34
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 39楼 九转星河
一次扫描同时扫出最大数和最小数,减少了扫描次数。

能编个毛线衣吗?
2018-05-24 11:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用renkejun1942在2018-5-24 11:28:48的发言:

因为同时从两头开始“冒泡”,比较次数并未减少,减少的是循环次数。


以下是引用wmf2014在2018-5-24 11:37:33的发言:

一次扫描同时扫出最大数和最小数,减少了扫描次数。


可以理解成是循环语句跳转需要时间么,就是说从循环结束跳转到开始这样需要一定的时间么,因为这种写法设计到要处理的变量多了,嗯,我只能这样理解了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-24 11:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
回复 46楼 九转星河
最终修改版。

程序代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
typedef int E_T;

void sort( E_T *array, int l, int r );

int main( void )
{
    E_T a[ 10 ] = {9,9,2,3,4,5,6,7,0,0};
  /*  srand( ( unsigned long )time( NULL ) );
    
    for( int i = 0; i < 10; ++i )
    {
        a[ i ] = rand() % 1000;
        printf( "%d ",a[ i ] );
    }*/
    printf( "\n" );
    sort( a, 0, 10 );
    for( int i = 0; i < 10; ++i )
        printf( "%d ", a[ i ] );
    return 0;
}


void sort( E_T *array, int l, int r )
{
    int minix, maxix;
    int R;
    int c;
    int f;
    int s;
    
    s = 0;
    
    if( l >= r )
        return;
    
    
    for( int ix = l; ix < r -1; ix++ )
    {
        if( array[ ix ] <= array[ ix + 1 ] )
            s++;
        else if( array[ ix ] > array[ix + 1 ] )
        {
            s--;
            if( s > 0 )
                break;
        }
        else
            break;
    }
    
    c=0;
    
    if( s == r - l - 1 )
    {
         printf("jiao huan %d ci\n",c);
        return;
    }
    else if( s == l - r + 1)
    {
        for(r -= 1 ; l < r; l++,r-- )
        {
            c++;
            E_T temp = array[ l ];
            array[ l ] = array[ r ];
            array[ r ] = temp;
        }
    }
    else
    {
        for( ; l < r; ++l, --r )
        {
             f = 0;
            for( minix = l + 1, maxix = r - 2, R = r - 1; minix <= R; ++minix, --maxix )
            {
                if( array[ l ] > array[ minix ] )
                {
                    c++;
                    f = 1;
                    E_T temp = array[ l ];
                    array[ l ] = array[ minix ];
                    array[ minix ] = temp;
                }
                if( array[ R ] < array[ maxix ] )
                {
                    c++;
                    f = 1;
                    E_T temp = array[ R ];
                    array[ R ] = array[ maxix ];
                    array[ maxix ] = temp;
                }
            }
            
            if( f != 0 )
                sort( array, l + 1, r - 1 );
        }
    }
    
    printf("jiao huan %d ci\n",c);
    
}




[此贴子已经被作者于2018-5-24 21:24编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 18:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 47楼 renkejun1942
这个就是能够减少比较次数了吧~

如果一次交换后是顺序那么就不用再排了,如果一次交换刚好是逆序,那么就直接把数据倒过来~
但这样减少交换次数却额外增加了比较次数~

    for( int ix = l; ix < r -1; ix++ )
    {
        if( array[ ix ] <= array[ ix + 1 ] )
            s++;   
        else
            break;
    }

这样看看有没有问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-24 20:09
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 48楼 九转星河
这几行代码的目的是判断数组是顺序还是逆序用的。当然也可以再加几行,用来判断顺序或逆序的元素有多少个,到乱序的元素时就跳出来。


在细节上还可以再完善。

[此贴子已经被作者于2018-5-24 21:18编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 21:01
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 48楼 九转星河
用一次遍历换N次潜逃循环,怎么算都是值得的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2018-05-24 21:10
快速回复:对同一列数据用各种排序法来统计分别各自交换了多少次,来比较用哪种方 ...
数据加载中...
 
   



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

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