快速排序算法(Qsort)

或许在面试与笔试中问的最多的就是这个快速排序算法(Quick sort)。

其实吧,这个快速排序的思想呢,很简单。

所谓快速排序就是,起始的时候选择一个关键值key一般为数组的第一个值,然后将数组分割成两部分,前一部分全部小于key,后一部分全部大于key,然后前一部分与后一部分分别进行这样的分组,结束后所得的序列就是有序的。

看吧思想炒鸡简单吧~但是实现呢?就有些纠结了,从上面的过程中可以明显看出使用了递归的方法。

从上面算法描述的过程中可以看出,寻找这个安排key值的位置是本算法的核心部分。下面看一下寻找的实现代码:

void swapdata(int arr[],int i,int j)
{
	int temp;

	temp=arr[i];
	arr[i]=arr[j];
	arr[j]=temp;
}
int find_key(int arr[],int low,int high)
{
	int key;
	key=arr[low];
	

	while(low<high)
	{
		while(low<high && arr[high]>key)
			high--;
		swapdata(low,high);
		while(low<high && arr[low]<key)
			low++;
		swapdata(low,high);
	}
	return low;
}

这里为了便于理解,我只说明首次寻找keylocation的过程。按照如下的图示:low以红色表示,high以浅绿色表示:


以上的寻找Key值的思想,可以这么描述:

       起始位置从末尾开始,遇到比key值小的就停止搜索,交换小值到前面;然后从头开始找,遇到比key值大的就停止搜索,交换key值到当前位置。然后一直找完整个数组就停止。

然后有了以上寻找key的过程,结合快速排序的思想,则快速排序的实现代码如下:

void fast_sort(int arr[],int low,int high)
{
	int keylocation;

	if(low<high)
	{
       keylocation=find_key(arr,low,high);
       fast_sort(arr,low,keylocation);
       fast_sort(arr,keylocation+1,high);
	}
}

void Qsort(int arr[],int length)
{
	fast_sort(arr,0,length-1);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值