zoukankan      html  css  js  c++  java
  • 十大经典排序算法(八、计数排序)

    动图演示

    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

    算法步骤

    • (1)找出待排序的数组中最大和最小的元素
    • (2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项
    • (3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
    • (4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

    JavaScript

     1 function countingSort(arr, maxValue) {
     2     var bucket = new Array(maxValue+1),
     3         sortedIndex = 0;
     4         arrLen = arr.length,
     5         bucketLen = maxValue + 1;
     6 
     7     for (var i = 0; i < arrLen; i++) {
     8         if (!bucket[arr[i]]) {
     9             bucket[arr[i]] = 0;
    10         }
    11         bucket[arr[i]]++;
    12     }
    13 
    14     for (var j = 0; j < bucketLen; j++) {
    15         while(bucket[j] > 0) {
    16             arr[sortedIndex++] = j;
    17             bucket[j]--;
    18         }
    19     }
    20 
    21     return arr;
    22 }

    Python

     1 def countingSort(arr, maxValue):
     2     bucketLen = maxValue+1
     3     bucket = [0]*bucketLen
     4     sortedIndex =0
     5     arrLen = len(arr)
     6     for i in range(arrLen):
     7         if not bucket[arr[i]]:
     8             bucket[arr[i]]=0
     9         bucket[arr[i]]+=1
    10     for j in range(bucketLen):
    11         while bucket[j]>0:
    12             arr[sortedIndex] = j
    13             sortedIndex+=1
    14             bucket[j]-=1
    15     return arr

    C语言

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 void print_arr(int *arr, int n) {
     6         int i;
     7         printf("%d", arr[0]);
     8         for (i = 1; i < n; i++)
     9                 printf(" %d", arr[i]);
    10         printf("
    ");
    11 }
    12 
    13 void counting_sort(int *ini_arr, int *sorted_arr, int n) {
    14         int *count_arr = (int *) malloc(sizeof(int) * 100);
    15         int i, j, k;
    16         for (k = 0; k < 100; k++)
    17                 count_arr[k] = 0;
    18         for (i = 0; i < n; i++)
    19                 count_arr[ini_arr[i]]++;
    20         for (k = 1; k < 100; k++)
    21                 count_arr[k] += count_arr[k - 1];
    22         for (j = n; j > 0; j--)
    23                 sorted_arr[--count_arr[ini_arr[j - 1]]] = ini_arr[j - 1];
    24         free(count_arr);
    25 }
    26 
    27 int main(int argc, char **argv) {
    28         int n = 10;
    29         int i;
    30         int *arr = (int *) malloc(sizeof(int) * n);
    31         int *sorted_arr = (int *) malloc(sizeof(int) * n);
    32         srand(time(0));
    33         for (i = 0; i < n; i++)
    34                 arr[i] = rand() % 100;
    35         printf("ini_array: ");
    36         print_arr(arr, n);
    37         counting_sort(arr, sorted_arr, n);
    38         printf("sorted_array: ");
    39         print_arr(sorted_arr, n);
    40         free(arr);
    41         free(sorted_arr);
    42         return 0;
    43 }
  • 相关阅读:
    windows下读取utf-8文件
    mongodb c api编译
    JS学习笔记
    【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案
    C#字符串截取
    C#通过WatiN操作页面中内嵌的Iframe
    C#查找以某个字母开头另一字母结尾的字符串
    HTML5+CSS3学习小记
    C#求任意范围内的质数
    C#中的委托
  • 原文地址:https://www.cnblogs.com/wangchaoguo-li/p/14206012.html
Copyright © 2011-2022 走看看