排序(Count Sort)
- 平均时间复杂度:O(n+k)
- 最好情况:O(n+k)
- 最坏情况:O(n+k)
- 空间复杂度:O(k)
- 排序方式:外部
-
C++代码实现
int countSort(vector<int>& arr,int min=NULL,int max=NULL){if(min == NULL) min = *min_element(arr.begin(), arr.end());if(max == NULL) max = *max_element(arr.begin(), arr.end());int len = max - min + 1, offset = 0;if(min < 0) offset = abs(min);int barrel[len];memset(barrel, 0, sizeof(barrel));for(const auto& val:arr){barrel[val + offset]++;}/* //不稳定vector<int>::iterator it=arr.begin();for(int i=0;i<len;i++){while(barrel[i]!=0){*it=i-offset;it++;barrel[i]--;}}*///稳定写法vector<int> record(arr.begin(),arr.end());for(int i = 1; i < len; i++) {barrel[i] += barrel[i-1];}for(int i = record.size() -1; i >= 0; i--){arr[--barrel[record[i] + offset]] = record[i];}}
1. 算法步骤
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组barrel的第i项
- 对所有的计数累加(从barrel中的第一个元素开始,每一项和前一项相加)(为了稳定)
- 反向填充目标数组:将每个元素i放在新数组的第barrel[i]项,每放一个元素就将barrel[i]减去1
2. 动图演示

