计数排序的核心思想是:
1 以待排序的数作为count序列的下标,以该下标出现的次数作为值。
2 线性的检测count序列的不为0的项,将此项的值 放在result序列的当前index下标项中,count序列中该计数减一。
代码实现如下:
int GetMaxValue(int* array,int length) { int maxValue = array[0]; for(int i =1;i < length;i++) { if(maxValue < array[i]) { maxValue = array[i]; } } return maxValue; } int GetMinValue(int* array,int length) { int minValue = array[0]; for(int i =1;i < length;i++) { if(minValue > array[i]) { minValue = array[i]; } } return minValue; } void CountSoft(int* array,int length) { int maxValue = GetMaxValue(array,length); int minValue = GetMinValue(array,length); int* count = new int[maxValue + 1]; memset(count,0,sizeof(int) * (maxValue + 1)); for(int i = 0;i < length;i++) { //计数 ++count[array[i]]; } int index = 0; for(int i = minValue;i < maxValue + 1;i++) { for (int j = count[i];j > 0;j--) { array[index++] = i; } } delete[] count; } int main() { int array[] = {12,31,1,21,11,3,89,56,14,89,10}; int length = sizeof(array) / sizeof(array[0]); CountSoft(array,length); std::for_each(array,array+length,[](int i){ std:: cout << i << " "; }); std::cout << std::endl; cout << "test\n"; return 0; }
计数排序使用了一个技巧 就是利用 count 以array[i] 做下标,这样就造成了自然有序。
计数排序的时间复杂度为:O(n+k) n为数组的长度,k为数组的范围大小 k = maxValue - minValue
计数排序的时间复杂度主要取决于 k(范围),范围越大,排序效率越低。
计数排序适合于范围幅度较小的序列排序。