计数排序

算法:

1、找出待排序的数组中最大和最小的元素

2、统计数组中每个值为i的元素出现的次数,存入数组C的第i项

3、对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

4、反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

01.#include <stdlib.h>  
02.#include <string.h>  
03.#include <stdio.h>  
04./************************************************************** 
05. 功能:计数排序。 
06. 参数: data : 要排序的数组 
07.        size :数组元素的个数 
08.        k   :数组中元素数组最大值 +1 (这个需要+1) 
09. 返回值: 成功0;失败-1.        
10. *************************************************************/  
11.int ctsort(int *data, int size, int k)  
12.{  
13.    int * counts = NULL,/*计数数组*/  
14.        * temp = NULL;/*保存排序后的数组*/  
15.    int i = 0;  
16.    /*申请数组空间*/  
17.    if ((counts = (int *) malloc( k * sizeof(int))) == NULL)  
18.        return -1;  
19.    if ((temp = (int *) malloc( k * sizeof(int))) == NULL)  
20.        return -1;  
21.    /*初始化计数数组*/  
22.    for (i = 0; i < k; i ++)  
23.        counts[i] = 0;  
24.    /*数组中出现的元素,及出现次数记录*/  
25.    for(i = 0; i < size; i++)  
26.        counts[data[i]] += 1;  
27.    /*调整元素计数中,加上前一个数*/  
28.    for (i = 1; i < k; i++)  
29.        counts[i] += counts[i - 1];  
30.    /*使用计数数组中的记录数值,来进行排序,排序后保存的temp*/  
31.    for (i = size -1; i >= 0; i --){  
32.        temp[counts[data[i]] - 1] = data[i];  
33.        counts[data[i]] -= 1;  
34.    }  
35.      
36.    memcpy(data,temp,size * sizeof(int));  
37.    free(counts);  
38.    free(temp);  
39.    return 0;  
40.}  
41.int main()  
42.{  
43.    int a[8] = {2,0,2,1,4,6,7,4};  
44.    int max = a[0],  
45.        i = 0;  
46.    /*获得数组中中的数值*/  
47.    for ( i = 1; i < 8; i++){  
48.        if (a[i] > max)  
49.            max = a[i];  
50.    }  
51.    ctsort(a,8,max+1);  
52.    for (i = 0;i < 8;i ++)  
53.        printf("%d\n",a[i]);  
54.}  

 

posted @ 2017-06-02 15:43  yl007  阅读(151)  评论(0编辑  收藏  举报