排序算法-快速排序

(1)思想:又称作分区排序。其基本思想为,任取待排序元素中的一个(例如第一个)作为基准,按照该元素的大小,将整个元素序列分为左右两个序列,左侧序列中的元素都小于基准元素,右侧序列中的元素都大于等于基准元素,基准元素排列在中间。然后,分别对左右两个序列重复实行此方法,直到所有元素都在排列位置上为止。

(2)c++实现:

void quickSort(int a[],int start,int end){
	if(start<end){
		int pivotPos = partition(a,start,end);//把a[start]作为基准点,划分好数组后返回基准点的位置
		quickSort(a,start,pivotPos-1);//quickSort左侧子序列
		quickSort(a,pivotPos+1,end);//quickSort右侧子序列
	}
}

int partition(int a[],int low,int high){
	int cursor = a[low];//基准点的数值
	/*
	开始划分操作
	*/
	while(low < high){
		while(low < high && a[high] >= cursor)//从高位往低位寻找第一个小于基准值的元素的位置
			high--;
		if(low < high){
			swap(a[low],a[high]);
			low++;
		}
		while(low < high && a[low] < cursor)//从低位往高位寻找第一个大于等于基准值的元素的位置
			low++;
		if(low < high){
			swap(a[low],a[high]);
			high--;
		}
	}
	a[low] = cursor;
	return low;//此时low就是基准点的位置
}
(3)复杂度:排序次数取决于递归树的深度,partition一个元素需要o(n),总共需要partition的次数为logn次,所以时间复杂度为o(nlogn)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值