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

冒泡是往下沉
选择是往上浮
两个排序的方式刚好是反着的

冒泡的交换次数较多
选择是先找出位置来,然后交换。交换的次数小于冒泡

他们的执行效率差不多,个人感觉区别是这些,不知道理解是否全面




理解有误,冒泡可以上浮也可以下沉,选择法是找出最小的数,像这样进行多次
2010-11-18 18:46
快速回复:[原创]C语言排序算法大全,大家进来支持一下
数据加载中...
 
   



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

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