ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

十大经典排序算法(八、计数排序)

2020-12-29 13:32:25  阅读:178  来源: 互联网

标签:count arr int bucket ++ 计数 算法 sorted 排序


动图演示

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

算法步骤

  • (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("\n");
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 }

 

标签:count,arr,int,bucket,++,计数,算法,sorted,排序
来源: https://www.cnblogs.com/wangchaoguo-li/p/14206012.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有