| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 998 人关注过本帖
标题:拉锯排序法
只看楼主 加入收藏
Fawsac
Rank: 1
等 级:新手上路
帖 子:13
专家分:7
注 册:2016-11-6
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:3 
拉锯排序法
拉锯排序法:是起泡排序法的改进,采用“上浮”、“下沉”交替进行的方式“起泡”。
有没有大神解释一下,用个简单的小程序演示
表示不太懂
2016-11-27 11:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
用返回自身函数可以减少一个循环,便于理解~我也是第一次编写如此算法,也许可以再改进一下~
程序代码:
#include<stdio.h>
int fun(int a[10],int i,int j)
{
    int t;
    int k=i;
    for (;i<j;i++)
        if (a[i]>a[i+1])
        {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
        }
    for (;i>k;i--)
        if (a[i]<a[i-1])
        {
            t=a[i];
            a[i]=a[i-1];
            a[i-1]=t;
        }
    if (i<5)
        return fun(a,++i,--j);
    else return 0;
}
int main()
{
    int a[10];
    int i;
    for (i=0;i<10;i++)
        scanf("%d",&a[i]);
    fun(a,0,9);

    for (i=0;i<10;i++)
        printf("%4d",a[i]);
    printf("\n");
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-27 13:26
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:10 
#include <stdio.h>
#define M 10
int main()
{
    int a[M]={5,3,4,1,2,8,9,7,0,6};
    int n=M,i=0,m=0;
    while(n>m)
    {

        int max,k;
        for(i=k=m;i<n;++i)        //下沉
        {
            if(a[m]>=a[i])
             {
                max=a[m];
                a[m]=a[i];
                a[i]=max;
            }   
        }
        int min;
        for(k=i=n-1;i>=m;--i)        //上浮
        {
            if(a[n-1]<=a[i])
             {
                min=a[n-1];
                a[n-1]=a[i];
                a[i]=min;
                k=i;
            }   
        }
        ++m;
        --n;        
    }
    for(i=0;i<M;++i)
        printf("%d\t",a[i]);
}
2016-11-27 15:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然想到一种高级一点的,下沉和上浮合在一起写~
程序代码:
#include<stdio.h>
#include<math.h>
#define N 10
#define A N-1-k-abs(i)
#define B N-1-k-abs(i-1)
void swap(int *a,int *b)
{
    *a^=*b;
    *b^=*a;
    *a^=*b;
}
int fun(int a[N],int k)
{
    int i;

    for (i=N-1-2*k;i>-(N-1)+2*k;i--)
    {
        if ((A>B)^(a[A]<a[B]))
             swap(&a[A],&a[B]);
    }

    if (k<N/2)
        return fun(a,++k);

    return 0;
}
int main()
{
    int a[N];
    int i;
    for (i=0;i<N;i++)
        scanf("%d",&a[i]);

    fun(a,0);

    for (i=0;i<N;i++)
        printf("%4d",a[i]);

    printf("\n");

    return 0;
}


[此贴子已经被作者于2016-11-27 17:17编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-27 17:16
快速回复:拉锯排序法
数据加载中...
 
   



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

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