| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1972 人关注过本帖, 4 人收藏
标题:[原创]C语言排序算法大全,大家进来支持一下
只看楼主 加入收藏
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
结帖率:0
收藏(4)
 问题点数:0 回复次数:22 
[原创]C语言排序算法大全,大家进来支持一下
程序代码:
一.冒泡法:

此法是最常用的一种方法,其思维比较简单,有两种冒泡法,一种是大数逐渐上浮到最后面,还有一种就是小的数依次浮到最前面,关于冒泡法上海大学教材上有详细说明,本人不多做解释,主要对代码进行一些解析。

法一:
#define N 10//宏定义命令,N代表10

#include<stdio.h>
main()
{
    int a[N],i,j,t;
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)//外循环控制次数,表示要执行N-1次冒泡

        for(j=0;j<N-1-i;j++)//从前往后,每比较一次后大的数

            if(a[j]>a[j+1])//就到了前后面

            {t=a[j];a[j]=a[j+1];a[j+1]=t;}
    for(i=0;i<N;i++)

        printf("%d ",a[i]);
    printf("\n");
}

法二:
#define N 10
#include<stdio.h>
main()
{
    int a[N],i,j,t;
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)//外循环控制次数

        for(j=N-1;j>i;j--)//从后向前,每比较一次小的数就到了

            if(a[j]<a[j-1])//前面
            {t=a[j];a[j]=a[j-1];a[j-1]=t;}
    for(i=0;i<N;i++)

        printf("%d ",a[i]);
    printf("\n");
}

二.选择法:

选择法的思路也比较简单,学校书上没说清楚,现在我说清楚一下,就是先找出最小数,然后将其与第一个数调换,再在第二个人数开始的数列中找出最小数,与第二个数调换,依次类推,本人就说这么多了,大家请自己体会。

法一:

/*此法代码比较简单,容易理解,推荐大家用这种方法*/

#define N 10
#include<stdio.h>
main()
{
    int a[N],i,j,t;
    for(i=0;i<N;i++)

        scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)

        for(j=i+1;j<N;j++)

           if(a[i]>a[j])//每当遇到a[i]比a[j]大时,都进行交换

           {t=a[i];a[i]=a[j];a[j]=t;}   

    for(i=0;i<N;i++)

        printf("%d ",a[i]);
    printf("\n");
}

法二:
#define N 10
#include<stdio.h>
main()
{
    int a[N],i,j,min,t;

 

    scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)

    {
        for(min=i,j=i+1;j<N;j++)//找出最小值所在下标

            if(a[min]>a[j]) min=j;
        if(min!=i)//这里是程序优化部分,也可不要

        {t=a[min];a[min]=a[i];a[i]=t;}
    }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
}

法三(构造函数):
(一学弟曾这样做过,叫我帮他排错,我帮他找出了错误,同时进一步优化程序,使程序的可读性尽量好,算法的时间复杂度尽量低,不过不推荐大家这样做)
#define N 10
#include<stdio.h>
int min(int a[],int i)
{
    int j,min;
    for(min=i,j=i+1;j<N;j++)

        if(a[min]>a[j]) min=j;

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

    {
        min1=min(a,i);
        if(min1!=i)
        {t=a[min1];a[min1]=a[i];a[i]=t;}
    }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
}

三.插入法:

插入法是这三种方法中最难得,一般用的较少,不推荐大家这样做,其基本思路是这样的,在之前已经排序好的数列中插入一个数,使其仍然有续,逐个进行下去,就可完成排序。

法一:
#define N 10
#include<stdio.h>
main()
{
    int a[N],i,j,t;
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(i=1;i<N;i++)
    {   /*t保存a[i]的值*/

        for(t=a[i],j=i-1;j>=0;j--)//从后向前依次对比a[i]和

            if(t<a[j]) a[j+1]=a[j];//a[j]值,若a[i]<a[j],

            else break; //则后移一位,若不成立,即找到了

        a[j+1]=t;//插入位置,这一句就是插入过程
    }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
}

法二:

这个是本人自己的方法,和教材上的有点不一样,教材上是在寻找插入位置的过程中逐个后移数组,我这个是先找到插入点,然后整体后移数组。

#define N 10
#include<stdio.h>
main()
{
    int a[N],i,j,k,t;
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(i=1;i<N;i++)
        for(j=0;j<N-1;j++)

            if(a[i]<a[j])//找到了插入位置
            {
                for(t=a[i],k=i;k>j;k--)//此循环为数组
                    a[k]=a[k-1];//后移过程,不做详细分析
                a[j]=t;//将a[i]插入指定位置
                break;
            }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
}

/*本人语言表达水平不够,也只能够做这些分析,大家应该记得一道题——对于一个有序数列,插入一个数后,使其仍然有续。会做这道题了插入法也就不难理解了*/

收到的鲜花
  • qhxxbc2010-11-22 15:50 送鲜花  3朵   附言:好文章
搜索更多相关主题的帖子: C语言 算法 大全 
2010-11-06 22:01
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:0 
支持,支持.

经验积累中............
2010-11-06 22:21
Invariably
Rank: 2
等 级:论坛游民
帖 子:54
专家分:46
注 册:2010-9-18
收藏
得分:0 
顶一个
2010-11-06 22:34
Invariably
Rank: 2
等 级:论坛游民
帖 子:54
专家分:46
注 册:2010-9-18
收藏
得分:0 
我感觉,冒泡法的算法一这一处“for(i=0;i<N-1;i++)”应该改成“for(i=N-1;i>0;i--)”
2010-11-06 23:09
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:0 
学习了.3Q!
2010-11-06 23:23
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-11-07 01:09
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
回4楼,不用改的,如果你要改的话,就要把内循环改一下,但是会使程序可读性变差,回楼上,如果没能分清就是没搞清楚冒泡和选择的原理,多思考就行了,多想想其具体过程
2010-11-07 13:13
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
回4楼,不用改的,如果你要改的话,就要把内循环改一下,但是会使程序可读性变差,回楼上,如果没能分清就是没搞清楚冒泡和选择的原理,多思考就行了,多想想其具体过程
2010-11-07 13:13
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
回4楼,不用改的,如果你要改的话,就要把内循环改一下,但是会使程序可读性变差,回楼上,如果没能分清就是没搞清楚冒泡和选择的原理,多思考就行了,多想想其具体过程
2010-11-07 13:14
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
回4楼,不用改的,如果你要改的话,就要把内循环改一下,但是会使程序可读性变差,回楼上,如果没能分清就是没搞清楚冒泡和选择的原理,多思考就行了,多想想其具体过程
2010-11-07 13:15
快速回复:[原创]C语言排序算法大全,大家进来支持一下
数据加载中...
 
   



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

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