基数
遍历桶方法
public:
void base(long long *a,int n){
vector<queue<int>> v;
int b=1;
for(int i=0;i<10;i++){
queue<int> q;
v.push_back(q);
}do{
b*=10;
for(int i=0;i<n;i++)v[a[i]%b/(b/10)].push(a[i]);
n=0;
for(int i=0;i<10;i++){
while(!v[i].empty()){
a[n++]=v[i].front();
v[i].pop();
}
}
}while(max(a,n)>b);
}
private:
int max(long long *a,int n){
int max=numeric_limits<int>::min();
for(int i=0;i<n;i++)if(a[i]>max)max=a[i];
return max;
}
希尔
除法方法
public:
void shell(long long *arr,int size){
int gap=size;
while(gap>1){
gap=gap/2;
shellsort(arr,size,gap);
}
}
private:
void shellsort(long long *arr,int size,int gap){
for(int i=0;i<size-gap;i++){
int end=i;
int temp=arr[end+gap];
while(end>=0){
if(arr[end]>temp){
arr[end+gap]=arr[end];
end-=gap;
}else break;
}arr[end+gap]=temp;
}
}