排序算法 - 计数排序
基本思想 计数排序是一种线性排序算法,它利用了一个数组,因为数组下标的增长是线性的,所以它就把自己的元素转换成新开辟数组的下标。可是下标都是非负数啊?数组当中的值有正有负啊。做一个简单的转化就行了:找到数组中最小元素,用元素值减去,这样一来,所有元素对应的下标就求出来了。(实际上感觉像是个映射函数?)下图中保存的是待排序数组:[-1,-5,-6,-2,1,2,8,2,1,8] 然后跟哈希排序的思路一样:这里。直接开辟一个对应的哈希数组,然后统计每个元素出现的次数。橙色标注出来的表示待排序数组中没有的元素(转换后的元素),自然就没有出现次数。这样可以看出来如果数组中元素差距很大,其实还是很浪费空间的,因为它新开辟数组的大小是待排序数组arr中max-min+1(8+6+1=15)。 最后再将count中的元素放回到arr中,就完成排序了。 算法代码 1 //计数排序 2 void CountSort(int *a, int size) 3 { 4 int max = a[0]; 5 int min = a[0]; 6 for (int i = 0; i < size; ++i) 7 { 8 if (a[i] > max) 9 max = a[i]; 10 if (a[i] < min) 11 min = a[i]; 12 } 13 int range = max - min + 1;