常见排序算法
快速排序
void swap(int & a,int &b){
int tmp = a;
a = b;
b = tmp;
}
void QuickSort(int a[],int s,int e){
if(s>=e) return;
int l=s,h=e,k=a[s];
while(l<h){
while(l<h&&a[h]>=k) h--;
swap(a[l],a[h]);
while(l<h&&a[l]<=k) l++;
swap(a[l],a[h]);
}
int m=l;
QuickSort(a,s,m-1);QuickSort(a,m+1,e);
}
归并排序
void Merge(int a[],int s,int m,int e,int tmp[]){
int p1=s,p2=m+1,pb=0;
while(p1<=m&&p2<=e){
if(a[p1]<a[p2]) tmp[pb++] = a[p1++];
else tmp[pb++] = a[p2++];
}
while(p1<=m) tmp[pb++] = a[p1++];
while(p2<=e) tmp[pb++] = a[p2++];
for(int i=0;i<pb;i++) a[i+s] = tmp[i];
}
void MergeSort(int a[],int s,int e,int tmp[]){
if(s>=e) return;
int mid = (e-s)/2+s;
MergeSort(a,s,mid,tmp);MergeSort(a,mid+1,e,tmp);
Merge(a,s,mid,e,tmp);
}
堆排序
void AdjustDown();
void BuildMaxHeap(int a[],int len){
for(int i=len/2;i>0;i--) AdjustDown(a,i,len);
}
void AdjustDown(int a[],int k,int len){
a[0] = a[k];
for(int i=2*k;i<=len;i*=2){
if(i<len&&a[i]<a[i+1])i++;
if(a[0]>a[i]) break;
else{
a[k]=a[i];
k = i;
}
}
a[k] = a[0];
}
void HeapSort(int a[],int len){
BuildMaxHeap(a,len);
for(int i=len;i>1;i--){
int tmp = a[i];
a[i]=a[1];
a[1]=tmp;
AdjustDown(a,1,i-1);
}
}