class ShellSort {//希尔
public:
int* shellSort(int* a, int n) {
if(n<=1&&a==NULL)
return a;
else
for (int div = n/2; div>=1; div/=2) {//步长每次减半
for (int i=div; i<n; ++i) {//从第DIV个开始排序
for (int j=i; j>=div&&(a[j]<a[j-div]); j-=div) {//跟前DIV个进行判断.若小就放在前面.
swap(a[j],a[j-div]);
}
}
}
return a;
}
};
class CountingSort {//计数
public:
int* countingSort(int* a, int n) {
map<int,int> ans;
for (int i=0; i<n; ++i) {
ans[a[i]]++;
}
int i = 0;
for (auto it = ans.begin(); it!=ans.end(); it++) {
for (int j = 0; j<it->second; j++) {
a[i++] = it->first;
}
}
return a;
}
};
<pre name="code" class="cpp">class RadixSort {//基数 用队列实现.
public:
int* radixSort(int* a, int n) {
queue<int> ans[10];
int radix = 1;
for (int k = 1; k<=4; ++k) {//最大数不超过10000时.
for (int i=0; i<n; ++i) {
int x = (a[i]/radix)%10;
ans[x].push(a[i]);
}
int j = 0;
for (int i=0; i<=9; ++i) {
while (!ans[i].empty()) {
a[j++] = ans[i].front();
ans[i].pop();
}
}
radix*=10;
}
return a;
}
};