面试题23——编码实现快速排序及其三种优化

快速排序:

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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值