堆排序
void swap(int arr[],int i,int j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
void heapInsert(int arr[],int index){
while(arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
void heapify(int arr[],int index,int size){
int left=index*2+1;
while(left<size){
int largest=left+1<size&&arr[left+1]>arr[left]?left+1:left;
largest=arr[largest]>arr[index]?largest:index;
if(largest==index){
break;
}
swap(arr,largest,index);
index=largest;
left=index*2+1;
}
}
void heapSort(int arr[],int n){
if(n==1||n==0)
return;
for(int i=0;i<n;i++)
heapInsert(arr,i);
int size=n;
swap(arr,0,--size);
while(size>0){
heapify(arr,0,size);
swap(arr,0,--size);
}
}
桶排序
void BucketSort(int arr[],int n){
if(n==1||n==0) return;
int Max=0;
for(int i=0;i<n;i++){
Max=max(Max,arr[i]);
}
map<int,int>bucket;
for(int i=0;i<n;i++){
bucket[arr[i]]++;
}
int i=0;
for(int j=0;j<bucket.size();j++){
while(bucket[j]-->0){
arr[i++]=j;
}
}
}
小和问题和逆序对可以用归并排序解决
一个数组中的相邻数的最大差值
int bucket(int num,int len,int min,int max){
return (num-min)*len/(max-min);
}
int maxGap(int num[],int n){
if(n==1||n==0)
return 0;
int Min=INF;
int Max=0;
for(int i=0;i<n;i++){
Min=min(Min,num[i]);
Max=max(Max,num[i]);
}
if(Min==Max){
return 0;
}
bool hasNum[200];
int maxs[200];
int mins[200];
int bid=0;
for(int i=0;i<n;i++){
bid=bucket(num[i],n,Min,Max);
mins[bid]=hasNum[bid]?min(mins[bid],num[i]):num[i];
maxs[bid]=hasNum[bid]?max(maxs[bid],num[i]):num[i];
hasNum[bid]=true;
}
int res=0;
int lastMax=maxs[0];
for(int i=1;i<=n;i++){
if(hasNum[i]){
res=max(res,mins[i]-lastMax);
lastMax=maxs[i];
}
}
return res;
}