counting_sort

学习算法导论的过程

感觉自己好懒,懒得去写题,懒得画流程图去理解

计数排序基本思想:对每一个输入的X都有小于等于X的数的数目,即对应X在数组中所排的位置。

计数排序的时间复杂度是线性的O(N+k),但当k过大时这个算法需要的辅助空间就过大了;

 1  #include<stdio.h>
 2 #include<string.h>
 3 #define N 8
 4 void counting_sort(int a[],int b[],int MAX);
 5 int main(){
 6     int a[10]={2,5,3,0,2,3,0,3};
 7     int b[10];
 8     int i;
 9     counting_sort(a,b,5);
10     for( i=1; i<=N; i++)
11         printf("%d ",b[i]);
12     return 0;
13 }
14 //计数排序
15 void counting_sort(int a[],int b[],int k){
16 
17     int c[1000];
18     int i;
    //将存储数组中各个数字个数的辅助数组c初始化
19     for( i=0; i<=k; i++)//O(k)
20         c[i] = 0;
    //记录待排a数组中每个数出现的个数
22     for( i=0; i<N; i++)//O(N)
23         c[a[i]]++;
24   //计算出每个数大于等于数的数目
25     for( i=1; i<=k; i++)//O(k)
26         c[i] = c[i]+c[i-1];
27   //归位到b数组中
28     for( i=0; i<N; i++){//O(N)
29         b[c[a[i]]] = a[i];
30         c[a[i]] = c[a[i]]-1;
31     }
32 
33 }

下面是一些简单的图解:

 

posted @ 2017-03-19 21:22  12345lpg  阅读(130)  评论(0)    收藏  举报