快速排序:
int Partation(int *arr,int low,int hign)
{
int tmp;
tmp=arr[low];
while(low<hign)
{
while((low<hign)&&arr[hign]>=tmp)
{
hign--;
}
if(low>=hign)
{
break;
}
else
{
arr[low]=arr[hign];
}
while((low<hign)&&arr[low]<=tmp)
{
low++;
}
if(low>=hign)
{
break;
}
else
{
arr[hign]=arr[low];
}
}
arr[low]=tmp;
return low;
}
//递归实现快排
void quick(int *arr,int low,int hign)
{
int par=Partation(arr,low,hign);
if(par>low+1)
{
quick(arr,low,par-1);
}
if(par<hign-1)
{
quick(arr,par+1,hign);
}
}
void quicksort(int*arr,int len)
{
quick(arr,0,len-1);
}
//非递归入栈操作进行排序
#include<math.h>
void quicksort(int*arr,int len)
{
int tmpsize=(int)ceil(log(double)len);
int*stack=(int*)malloc(sizeof(int)*tmpsize*2);
assert(stack!=NULL);
int low=0;
int hign=len-1;
int par=Partation(arr,0,len-1);
int top=0;
if(par>low+1)
{
stack[top++]=low;
stack[top++]=par-1;
}
if(par<hign-1)
{
stack[top++]=par+1;
stack[top++]=hign;
}
while(top>0)
{
hign=stack[--top];
low=stack[--top];
par=Partation(arr,low,hign);
if(par>low+1)
{
stack[top++]=low;
stack[top++]=par-1;
}
if(par<hign-1)
{
stack[top++]=par+1;
stack[top++]=hign;
}
}
}
优化一:随机选取基准法
void Swap(int*arr,int low,int hign)
{
int tmp=arr[low];
arr[low]=arr[hign];
arr[hign]=tmp;
}
void quick(int*arr,int low,int hign)
{
Swap(arr,low,rand()%(hign-low)+low);
int par=Partation(arr,low,hign);
if(par>low+1)
{
quick(arr,low.par-1);
}
if(par<hign-1)
{
quick(arr,par+1,hign);
}
}
void quicksort(int *arr,int len)
{
quick(arr,0,len-1);
}
优化二:三数取中法
void Median_of_three(int*arr,int low,int mid,int hign)
{
if(arr[mid]>arr[low])
{
Swap(arr,mid,low);
}
if(arr[mid]>arr[hign])
{
Swap(arr,mid,hign);
}
if(arr[low]>arr[hign])
{
Swap(arr,low,hign);
}
}
void quick(int*arr,int low,int hign)
{
Median_of_three(arr,low,(hign-low)/2,hign);
int par=Partation(arr,low,hign);
if(par<hign-1)
{
quick(arr,par+1,hign);
}
if(par>low+1)
{
quick(arr,low,par-1);
}
}
void quicksort(int *arr,int len)
{
quick(arr,0,len-1);
}
优化三:基准聚拢法
void Focus_Num(int *arr,int low,int par,int hign,int*left,int*right)
{
int i;
int Pleft=par-1;
for(i=par-1;i>=low;i--)
{
if(arr[i]==arr[par])
{
if(i==Pleft)
{
Pleft--;
}
if(i!=Pleft)
{
Swap(arr,i,Pleft);
Pleft--;
}
}
}
int Pright=par+1;
for(i=par+1;i<=hign;++i)
{
if(arr[i]==arr[par])
{
if(i==Pright)
{
Pright++;
}
if(i!=Pright)
{
Swap(arr,i,Pright);
Pright++;
}
}
}
*left=Pleft;
*right=Pright;
}
void quick(int*arr,int low,int hign)
{
int par=Partation(arr,low,hign);
int left=par-1;
int right=par+1;
Focus_Num(arr,low,hign,&left,&right);
if(par>low+1)
{
quick(arr,low,left);
}
if(par<hign-1)
{
quick(arr,right,hign);
}
}
void quicksort(int *arr,int len)
{
quick(arr,0,len-1);
}