比较排序:在排序的最终结果中,各元素的次序依赖于他们之间的比较。

  计数排序基本思想:输入一个数X,确定小于X的元素的个数,这样,就可以把这个数放在输出数组的指定位置上。

  假设输入数组是A[1...n],则需要一个辅助数组C[0...K],一个输出数组B[1...n]。其中k代表输入数组中的最大值,n代表输入数组的长度。

  其中,输入数组A是需要进行排序的一组数据,输出数组B是需要排序完成后的数据。辅助数组中是按键值存储该键值在输入数组中出现的次数。

  思路:

  1、初始化辅助数组。

  2、循环遍历每一个输入元素,如果一个输入元素为i,则辅助数组中相应的C[i]的值加1。执行完毕之后。数组C中存储的就是各个键值在输入数组中出现的次数。

  3、再通过加总计算确定对于从1到k,有多少个输入元素是小于等于k的。将结果赋值到数组C中。

  4、循环将A[J]放到它在输出数组的正确位置上。对于一个值来说,C[A[J]]的值就是它在输出数组B中的正确位置。

      当输入数组中的元素都是互异时,就比较好理解。但是当数组中有些元素相同时。

      我们每将一个值放入输出数组中,都要将辅助数组中相应的值减1。这样,当存在下一个相同的值时,该元素可直接放在输出数组中相对应的位置上。

  总结:计数排序的时间复杂度为O(n),计数排序最重要的特性是稳定。

  缺点:计数排序非常浪费空间。例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量。

#include <stdio.h>
int main()
{
    int a[11],i,j,t;
    for(i=0;i<=10;i++)
        a[i]=0;  //初始化为0
                 
    for(i=1;i<=5;i++)  //循环读入5个数
    {
        scanf("%d",&t);  //把每一个数读到变量t中
        a[t]++;  //进行计数
    }
    for(i=0;i<=10;i++)  //依次判断a[0]~a[10]
        for(j=1;j<=a[i];j++)  //出现了几次就打印几次
            printf("%d ",i);
    getchar();getchar();
    //这里的getchar();用来暂停程序,以便查看程序输出的内容
    //也可以用system("pause");等来代替
    return 0;
}

  桶排序:桶排序实质上与计数排序差异不大。

  桶排序的时间复杂度为O(n)。计数排序是假设输入的数据都属于一个小区间内的整数,而桶排序则假设输入是由一个随机过程产生的。该过程将元素均匀、独立的分布在区间[0,1)上。

  桶排序基本思路:

  1、输入数组为A,辅助数组为B。初始化数组B,可将[0,1)按指定大小分为N个区间,即数组中有N个元素。称为桶。

  2、循环遍历输入数组,将A数组中大小位于某一区间的数存放在指定的B数组元素维护的链表上。

      B数组上的元素维护一个链表。链表上的元素是位于区间大小的A数组元素。

  3、完成上述操作之后,将B数组中每个元素维护的链表进行排序。

  4、最后按照B数组中元素的顺序输出。B[0]—>B[1]—>....B[N-1]。

posted on 2016-05-15 18:44  suvllian  阅读(6446)  评论(0编辑  收藏  举报