输入增强
输入增强:对问题的部分或全部输入做预处理,然后将获得的额外信息进行存储,以加速后面问题的求解。
比较计数排序
思路:
针对带排序列表中的每一个元素,算出列表中小于该元素的元素个数,并把结果记录在一张表中,这个“个数”指出了该元素在有序列表中的位置。
vector<int> ComparisonCountingSort(vector<int> &A){
vector<int> res;
int n = A.size();
int arr[n];
// 将数组所有元素初始化为0
memset(arr,0,sizeof(arr));
for(int i=0; i < n-1; ++i) {
for(int j = i+1; j<n ; ++j) {
if(A[i]<A[j])
arr[j] += 1;
else
arr[i] += 1;
}
}
for(int i=0;i<A.size();++i)
res[arr[i]] = A[i];
return res;
}
分布计数排序
[13,11,12,13,12,12],l=11,n=13
vector<int> DistributionCountingSort(vector<int> A,l,u) {
vector<int> res;
int arr[u-l];
memset(arr,0,sizeof(arr));
for(int i=0; i< A.size; ++i) {
arr[A[i]-l] += 1;
}
// arr:[1,3,2]
for(int j=1; j<=u-l; ++l) {
arr[j]=arr[j-1]+arr[j];
}
// arr:[1,4,6]
// 从后面开始是为了保证排序的稳定性,即对于相同的两个数,最开始位置在后面的,排序好之后位置仍在后面。
for(int i=A.size()-1;i>=0;--i) {
int j = A[i]-l;
res[arr[j]-1]=A[i];
arr[j] -= 1;
}
return res;
}