1. 程式人生 > 實用技巧 >十大經典排序演算法(八、計數排序)

十大經典排序演算法(八、計數排序)

計數排序的核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。

演算法步驟

  • (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 }