八大排序学习之六快速排序

从C语言中我们了解到有个函叫做快速排序函数,我们知道之中排序方法很快,之前我们只是会用,所以今天我们一起学习快速排序的基本思想和实现。

快速的排序的平均时间复杂度为:O(nlog2n),是一种 不稳定的排序方法。

快速排序的基本思想是从数组中取一个值作为基准,把小于基准的数放在左边,大于基准的数放在右边,通过递归细分每一个区间,从而达到排序的效果。

实现的步骤:

从数组的两端开始访问,第一、从右边往左开始不遍历比基准小的数,有则,停下,没有继续往左;第二步、从左到右遍历比基准大的数,有则停下,没有则继续往右(这些都是基于两边访问还没有访问到,相同的数的前提下),直到两个都停下来,而且两个下标不一样就直接交换两个数,直到两个下标相同,则把基准作为当前的位置的值。

例如:有数组 int a[5]={2,8,7,5,6,1};

取第一个为基准,2

int i,j; 把 i从左边到右移动,把j从右到左移动

先判断j,a[j]=1小于基准,停下。 

第二步,判断i,i=2,交换两值

得到1,8,7,5,6,2

继续往前

j--;a[j]=6大于基准2停下, i++,a[i]=8,也大于基准,交换两值

得1,6,7,5,8,2

继续,直到i=j=2,交换基准得a[2]=2,递归基准左边的区间和基准右边的区间

得到1,2,5,6,7,8

关键代码:

inline void adjustarr(int arr[],int left,int right)
{
	if(left>right) return;
	int i=left;
	int j=right;
	int x=arr[left]; 
	while(i!=j)
	{
		while(i<j&&arr[j]>=x)
			j--;
		while(i<j&&arr[i]<x)
			i++;
		//把比x小的放在i的左边,比x大的放在右边,这里用交换
		Myswap(arr[i],arr[j]);
	}
	Myswap(arr[i],x);
	//继续处理i左边和i右边的
	adjustarr(arr,left,i-1);
	adjustarr(arr,i+1,right);
}
对于20000个数据的执行情况如下:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值