算法导论--第八章、计数排序
一、计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则将x放在第18个位置即可。但是当存在几个元素相同时,会稍许不同,否则中间会漏掉元素。
二、假设输入是一个数组A[1..n],A.length = n。另外数组B[1...n]存放排序的输出,C[0...k]提供临时的存储空间:
伪代码如下:
1 Counting-Sort(A, B, k) 2 for i <- 1 to k 3 do C[i] <- 0 4 5 for j <-1 to length[A] 6 do C[A[j]] <- C[A[j]] + 1 7 8 for i <- 2 to length[A] 9 do C[A[i]] <- C[A[i]] + C[A[i - 1]] 10 11 for j <- length[A] downto 1 12 do B[C[A[j]]] <- A[j] 13 C[A[j]] <- C[A[j]] - 1
代码如下:
#include <stdio.h> #include <stdlib.h> #define MaxSize 8 void CountingSort(int A[], int B[], int k){ int i, j, a, b; int C[6]; //初始化数组C[] for(i = 0; i <= k; i++){ C[i] = 0; } //对A[]数组每个元素计数并存于C[]中 for(j = 0; j < MaxSize; j++){ C[A[j]] = C[A[j]] + 1; } //两两相加,C[]每个元素记录小于该下标的元素个数 for(i = 1; i < k; i++){ C[i] = C[i] + C[i - 1]; } for(j = MaxSize - 1; j >= 0; j--){ B[C[A[j]] - 1] = A[j]; C[A[j]] = C[A[j]] - 1; } } int main(){ int A[MaxSize] = {2, 5, 3, 0, 2, 3, 0, 3}; int B[MaxSize]; int i; printf("A[]...\n"); for(i = 0; i < MaxSize; i++){ printf("%d ", A[i]); } CountingSort(A, B, 6); printf("\nB[]...\n"); for(i = 0; i < MaxSize; i++){ printf("%d ", B[i]); } printf("\n"); system("pause"); return 0; }
运行结果如下: