快速排序

1.思想

设需要排序的数组下标p-r,选择p-r任意一个数据pivot(分区点),遍历p-r,将小于pivot的数据放左边,大于pivot的数据放右边,pivot放中间,进过这一步骤后,数组p-r,即被分为三个部分(p、q-1)小于pivot(q+1、r)大于pivot中间是pivot,根据分治、递归的思想,递归排序p-q-1、q+1-r的数据,直到区间缩小为1说明数据有序

图解:

递推公式、终止条件

递推公式:
q = partition(p...r)
quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1, r)

终止条件:
p >= r

代码实现:

分治递归过程

//快速排序
void quickSort(vector<int> & data)
{
	int n = data.size();
	quickSort(data, 0, n - 1);
}

void quickSort(vector<int> & data, int lo, int hi)
{
	if (lo >= hi) return;
	int q = partition(data,lo,hi);
	quickSort(data, lo, q-1);
	quickSort(data,q+1,hi);

}

和归并排序类似,想要实现快速排序关键是要实现分区函数partition()

实现思路图解

 分区函数实现

//分区函数
int partition(vector<int>& data,int lo , int hi) {
	int part = data[hi];
	int i = lo;
	for (int j = lo; j <= hi - 1; j++)
	{
		if (data[j] < part)
		{
			swap(data[i], data[j]);
			i++;
		}
	}
	swap(data[i],data[hi]);
	return i;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值