void quick_sort(int *a,int left,int right){
if(right-left>=cutoff){
//cutoff于此处为区分快速排序和插入排序的阈值,数据较多时选择快排
int pivo=getpivot(a,left,right);
int i=left+1,j=right-2,tmp;
while(i<j){
while(a[i]<pivo)
i++;
while(a[j]>pivo)
j--;
if(i<j){
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
tmp=a[right-1];
a[right-1]=a[i];
a[i]=tmp;
quick_sort(a, left,i-1);
quick_sort(a, i+1,right);
}
else
Insert_sort(a+left,right-left+1);
}
int getpivot(int *a,int left,int right){
//在left,right,mid三者之间取中位数,并将其置于待排元素的倒数第二个,即right-1处
int mid=(left+right)/2,tmp;
if(a[left]>a[mid]){
tmp=a[mid];
a[mid]=a[left];
a[left]=tmp;
}
if(a[left]>a[right]){
tmp=a[right];
a[right]=a[left];
a[left]=tmp;
}
if(a[mid]>a[right]){
tmp=a[mid];
a[mid]=a[right];
a[right]=tmp;
}
tmp=a[mid];
a[mid]=a[right-1];
a[right-1]=tmp;
return a[right-1];
}
void Insert_sort(int *a,int N){
int temp,j;
for(int i=1;i<N;i++){
temp=a[i];
for(j=i;j>0&&a[j-1]>temp;j--)
a[j]=a[j-1];
a[j]=temp;
}
}