快速排序方法及代码

快速排序

原理

这是一个利用递归排序的算法。
给我一组序列(未必是数组,也可以是链表),首先要知道其长度。
定义一个函数,输入参数要包括待排序的序列指针,子序列起始元素索引low,终止元素索引high。
1.将起始元素存于临时变量tmp中。
2.将起始元素索引,终止元素索引存为临时变量head和rear,便于递归时调用。
3.(!!!)low和high如果已经重合,或low已大于high,则停止递归。
3.终止元素索引high指向的元素,是否比tmp大?
如果大,则向左移动一位
如果小,不仅不移动,还要将high指向的元素值赋给起始元素索引low指向的元素值
暂停移动high,开始移动low。
4.起始元素索引low指向的元素,是否比tmp小?
如果小,则向右移动一位
如果大,不仅不移动,还要将low指向的元素值赋给high指向的元素值
暂停移动low,开始移动high。
5.对于第3和4步,low和high相同时停止移动。
6.将tmp的值赋给low(high)所在位置。
7.此时序列被一分为二。分别递归地对左右两部分调用自身对(head—low-1)、(low+1—rear)排序

以下是代码

void quick(int *a,int low, int high) {
	int tmp;
	int head = low; //为了保留切分后数组的长度,首元素等信息
	int rear = high;
	tmp = a[low];
	if (low >= high)
		return; //递归的停止条件,即切分后只剩两个元素时停止
	while (low != high) {
		while (low != high && a[high] > tmp) {
			high--;
		}
		a[low] = a[high];
		while (low != high && a[low] < tmp) {
			low++;
		}
		a[high] = a[low];
	}
	a[high] = tmp;
	quick(a, head, high-1);
	quick(a, high + 1, rear);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值