zoukankan      html  css  js  c++  java
  • 图解数据结构---计数排序

    参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484043&idx=1&sn=3743a5e3f79fba00ca794704e0c5a1ba&scene=19#wechat_redirect

    • 计数排序(C语言版):空间复杂度=时间复杂度=O(n+k)

      算法步骤:

    1. 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

    2. 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

    3. 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

    4. 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

      

      算法演示:

      

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void count_sort(int A[],int length){
     5     /*时间复杂度=空间复杂度 = O(n+k)
     6      * 参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484043&idx=1&sn=3743a5e3f79fba00ca794704e0c5a1ba&scene=19#wechat_redirect
     7      * 1.花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max
     8      * 2.开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)
     9      * 3.数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
    10      * 4.最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数
    11      */
    12 
    13     //寻找最大值与最小值。
    14     int max = A[0],min = A[0];
    15     for(int i = 0;i < length;i++){
    16         if(max < A[i]){
    17             max = A[i];
    18         }
    19         if(min > A[i]){
    20             min = A[i];
    21         }
    22     }
    23     //构造新数组,并置零。
    24     int range = max-min+1;
    25     int B[range];
    26     memset(B,0, sizeof(B));
    27     //统计每个数出现次数,将次数赋予B数组
    28     for(int i = 0;i < length;i++){
    29         B[A[i] - min]++;
    30     }
    31     //按照B数组中每个数字的次数,输出排序后的A数组
    32     int index = 0;
    33     for(int i = 0;i < range;i++){
    34         while(B[i] --){
    35             A[index] = i + min;
    36             index++;
    37         }
    38     }
    39     //输出
    40 //    for(int i = 0;i< length;i++){
    41 //        printf("%d ",A[i]);
    42 //    }
    43 }
    44 
    45 
    46 int main (){
    47     int A[] = {5,3,4,7,2,4,3,4,7};
    48     int length = sizeof(A)/sizeof(int);
    49     count_sort(A,length);
    50     
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    最优二叉树(简易版本)
    平衡二叉树(AVL树)基础操作
    二叉树的基础操作
    双向链表(C语言)
    循环链表(C语言)
    单向链表(C语言)
    jQuery
    js事件
    JDBC-扩展
    JDBC
  • 原文地址:https://www.cnblogs.com/BANLOONG/p/10569546.html
Copyright © 2011-2022 走看看