第八章线形时间排序之“计数法排序COUNTING-SORT”
来源:互联网 发布:文笔好的宫廷小说知乎 编辑:程序博客网 时间:2024/04/29 14:56
这个方法很牛逼,这个排序方法不再像前面那些排序方法一样根据比较来进行。
时间复杂度为O(k+n+k+n+n)=O(n),当k=O(n)时,可以保证时间复杂度为O(n),就可以用计数法来进行排序了。
这个方法的一个前提是必须要知道要排序的数组中元素的取值范围。
#include <string.h>#include <time.h>#define BUFFER_SIZE 10void CountingSort(int *a,int len,int k){//a[]中的数在0~k之间 int i=0;int c[k+1];int b[len+1];int tmp=0;for(i=0;i<=k;i++){//计数清零,复杂度O(k)c[i]=0;}for(i=1;i<=len;i++){//开始计数,复杂度O(n)c[a[i]]++;}for(i=1;i<=k;i++){//复杂度O(k)c[i]+=c[i-1];//c[i]中装的是小于等于i的数的个数 } for(i=len;i>0;i--){//按着计数来排序,复杂度O(n)。之所以从len到着来排序,是为了保持稳定性。tmp=a[i];b[c[tmp]]=tmp;c[tmp]--;}for(i=1;i<=len;i++){//把数组再复制回a中a[i]=b[i];}}int main(){int i=0;int a[BUFFER_SIZE+1]; //随机生成数组 srand((unsigned)time(NULL));for(i=1;i<=BUFFER_SIZE;i++){a[i]=rand()%(BUFFER_SIZE+1);} printf("随机生成的数组:\n");for(i=1;i<=BUFFER_SIZE;i++){printf("%d ",a[i]);} printf("\n");CountingSort(a,BUFFER_SIZE,BUFFER_SIZE);printf("对数组进行计数排序:\n"); for(i=1;i<=BUFFER_SIZE;i++){printf("%d ",a[i]);}system("pause");return 0;}
- 第八章线形时间排序之“计数法排序COUNTING-SORT”
- 算法导论 第八章计数排序(counting sort)
- 计数排序(Counting-Sort)
- 计数排序:counting-sort
- 计数排序(Counting Sort)
- 计数排序 Counting Sort
- Counting sort 计数排序
- 计数排序Counting sort
- 计数排序Counting sort
- 计数排序Counting sort
- 计数排序-Counting sort
- 计数排序-Counting Sort
- 线性时间排序 计数排序(Counting Sort)
- 第七章 ALDS1_6_A:Counting Sort 计数排序
- java计数排序(counting sort)
- 计数排序 (Counting Sort)
- 计数排序(Counting Sort)
- 计数排序(Counting Sort)
- BroadcasstReceiver简介
- git 常用命令
- JavaScript中的正则表达式解析[JS正则知识]
- linux schedule() 流程图
- 2011 工作总结
- 第八章线形时间排序之“计数法排序COUNTING-SORT”
- 【轻松学排序算法】眼睛直观感受几种常用排序算法
- WCF Learning(3):在WCF中实现双向通信(Bi-directional Communication)
- android动画实例之(图片闪烁、左右摇摆、上下晃动等效果)
- 支持NFC的Android手机型号
- APP安装支持安装到SDCard
- 编程之美 寻找发帖水王 扩展问题
- 正向代理与反向代理之我见
- Java内存管理