• 计数排序


    算法:

    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
    ",a[i]);  
    54.}  
  • 相关阅读:
    Cronolog切割tomcat日志
    使用TortoiseGit+码云管理项目代码
    POI使用 (4.0) 常用改动
    MySQL-with rollup函数运用
    CentOS7使用yum安装MySQL8.0
    java 8 新特性之Stream的排序/分类
    java阳历转农历
    MyBatis SQL xml处理小于号与大于号
    mysql update不能直接使用select的结果
    Java面试中遇到的坑【填坑篇】
  • 原文地址:https://www.cnblogs.com/yl-saber/p/6933664.html
Copyright © 2020-2023  润新知