比较排序:在排序的最终结果中,各元素的次序依赖于他们之间的比较。数组
计数排序基本思想:输入一个数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]。