计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
注意:计数排序对输入元素有严格要求,因为array元素值被用来当作tmpArray数组的下标,所以如果array的元素值为100的话,那么tmpArray数组就要申请101(包括0,也就是 mix - min + 1)。
<pre name="code" class="cpp">#include<stdio.h> #include<stdlib.h> void print_array(int *array, int length) { int index = 0; printf("array:\n"); for(; index < length; index++){ printf(" %d,", *(array+index)); } printf("\n\n"); } void countSort(int *array, int length) { /* int *tmpArray = (int*)malloc(sizeof(int)*length); int i, j, count; for (i = 0; i < length; i++) tmpArray[i] = 0; for (i = 0; i < length; i++){ for (count = 0, j = 0; j < length; j++){ if (array[i] < array[j])count++; } while(tmpArray[count])count++; tmpArray[count] = array[i]; } for (i = 0; i < length; i++)array[i] = tmpArray[i]; free(tmpArray); */ int *tmpArray = (int*)malloc(sizeof(int)*(length+1));//申请内存空间,记得大小为length + 1(因为array元素值为 0~9) int tmp[length]; int i, j, k; for (i = 0; i < length; i++){ // 初始化数组 tmpArray[i] = 0; tmp[i] = 0; } for (i = 0; i < length; i++) tmpArray[array[i]]++; // 表示该桶内有多少个元素 for (i = 1; i <= length; i++) tmpArray[i] += tmpArray[i-1];// 统计大于该元素的元素个数 for (i = length; i > 0; i--){// 这是核心代码了,可以理解为把array数组中的元素存放到合适的位置 tmp[tmpArray[array[i-1]]-1] = array[i-1]; tmpArray[array[i-1]]--; // 解决一个桶内有多个元素 } for (i = 0; i < length; i++) array[i] = tmp[i];// 把有序元素放回到array数组中 free(tmpArray);// 是否空间 } int main(void) { // int array[] = {12, 1, 32, 201, 9987, 5, 10, 10090, 123, 453}; int array[] = {2, 1, 3, 0, 9, 5, 1, 7, 4}; int length = (sizeof(array)) / (sizeof(array[1])); print_array(array, length); countSort(array, length); print_array(array, length); return 0; }
运行结果:
时间复杂度可以很好的看出了就是:O( n );