计数排序和桶排序

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

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

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

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

  思路:排序

  一、初始化辅助数组。get

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

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

  四、循环将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)上。

  桶排序基本思路:

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

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

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

  三、完成上述操做以后,将B数组中每一个元素维护的链表进行排序。

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

相关文章
相关标签/搜索