c语言基础算法(一)---排序

来源:互联网 发布:mac终端建立文件夹 编辑:程序博客网 时间:2024/05/22 15:31

c语言简单排序算法

在c语言学习中,排序算法很重要,在学完数组后,就必须学会排序算法,不论是刷题还是做一些东西,都必须掌握,下面介绍几种简单的排序算法。

桶排序–最简单最快的排序

桶排序,从名字上都觉得蛮有意思的,它实现的方法很简单,就是弄一大堆桶,每个桶上按顺序贴上标签,比如我要10个数排序,这10个数的范围是0到100,于是我就创建一个啊a[101]的数组数组,也就是100个桶,下标就是代表该桶的值。然后排序的时候,出现一个数,就让该数值的桶里面放个石头,也就是该数组元素的值+1,然后排序的时候,就可以从第一个桶开始数,看里面有石头没,有几个,如果有就输出该桶上的值,没有就看下一个,这样就从小到大排序了哈,如果想从大到小排序,就从最后一个桶开始往前数。

#include <stdio.h>int main(void){    int book[1000],i,j,k,t,n;    //输出数字的范围是0到999,也就是999个桶    for(i = 0;i < 1000;i++)    {        book[i] = 0;  //清空数组,也就是所有桶里一开始没有石头     }    scanf("%d",&n);   //输入你要排序多少个数    for(i = 0;i < n;i++)  //循环读入n个数     {        scanf("%d",&t);        book[t]++;          //桶里放石头哈     }     for(i=1000;i>=0;i--)     //从大到小排序     {        for(j=0;j<book[i];j++)        {            printf("%d ",i);    //有几个石头就输出几次         }               `    }     return 0;} 

桶排序速度快,简单,但是它是用空间来换取时间,占的内存大,可以去重复的数字特别方便,这个只是简单的桶排,只能处理不是特别大的数字。

快速排序

在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。

步骤如下:

在序列中选择一个关键元素做为轴;

对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;

递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。

下面的动画展示了快速
排序算法的工作原理。
这里写图片描述

#include <stdio.h>int a[1000];void sort(int a[],int left,int right){    int i=left;    int j=right;    int temp=a[left];    if(left<right)    {        while(i < j)        {            while(a[j]>temp&&i<j){                j--;            }              a[i]=a[j];            while(a[i]<temp&&i<j){                i++;            }            a[j]=a[i];        }        a[i]=temp;        sort(a,left,i-1);        sort(a,j+1,right);    }     else    {        return;    }}int main(void){    int n,i;    scanf("%d",&n);    for(i = 0;i < n;i++)    {        scanf("%d",&a[i]);    }    sort(a,0,n-1);    for(i = 0;i < n;i++)    {        printf("%d ",a[i]);    }    return 0;}

这个我写的快排函数感觉有点和书上写的不太一样,但是能用,尴尬。
快排里面用到了,分治的想法,递归处理,速度较快,但是不稳定。

冒泡排序

自己对冒泡排序这个名字觉得蛮有意思的,就像鱼鱼吐泡泡一样,小的数不断往上跑,其实这个算法也蛮简单的,就是两重循环,大的循环是要走的趟数,趟数是n-1,n为要排序的数的个数,小循环里面是每循环一次,就把改数组里最大的或最小的数放到最后面,下一次小循环,就把剩下的数,最大的或最小的放在剩下的数的最后面,这样就完成了从小到大排序或从大到小排序。

#include <stdio.h>int main(void){    int a[100],i,j,t,n;    scanf("%d",&n);  //输入要排序的数的个数    for( i =0;i< n;i++)    {        scanf("%d",&a[i]);    }    //冒泡排序的核心部分    for(i =0;i<n-1;i++)    {        for(j=0;j<n-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]);    }     return 0;} 

冒泡排序有两重循环,时间复杂度高

总结

以上就3种简单的排序,还有许多排序方法,这里的排序算法都按我自己的理解写解释了下,哇咔咔。

原创粉丝点击