快速排序--数组指针版本

本文介绍了快速排序算法的实现思路,通过设置基准数,将数组分为小于基准数和大于基准数两部分,然后递归地对这两部分进行排序。详细阐述了如何通过两个指针i和j进行元素交换,确保基准数位于正确位置,并提供了完整的递归部分的代码实现。
摘要由CSDN通过智能技术生成

要求:实现快排函数,
void quick_sort(Record* startPointer, Record* endPointer)

快速排序思路

  1. 找一个基准数
  2. 通过排序将待排记录分割成独立的两部分,其中一部分所有的数都比基准数小,另一部分所有的数都比基准数大
  3. 分割完以后,可以确定的是,基准数已经到了它相应的位置。
  4. 然后再对两部分分别进行快排

代码实现(从小到大排序)

快排示意图

我们设置基准数(这里设置第一个为基准数)key
再设置两个哨兵 i , j,一个从前往后找,另一个从后往前找

这里的 i 和 j 可以理解为 比key小的部分 和 比key大的部分

先让 j 向前移动,从后往前找到第一个比基准数小的数 x ,如果没有超出 i < j 的范围就把 x 放进到 i 里。
并且 i 这个坑位已经放进了比基准数小的,所以让 i ++

		while (*j > key && i < j)	j--;
		if (i < j) {
			*i = *j;
			i++;
		}

同理让 i 向后移动

		while (*i < key && i < j) i++;
		if (i < j) {
			*j = *i;
			j--;
		}

最后分割完,并且返回基准数的指针位置,这是分割的完整代码

template <class Record> 
Record* getindex(Record *startPointer,Record *endPointer) {
	Record*i = startPointer;
	Record*j = endPointer;
	Record key = *startPointer;
	
	while (i < j) {
		while (*j > key && i < j)	j--;
		if (i < j) {
			*i = *j;
			i++;
		}
		while (*i < key && i < j)  i++;
		if (i < j) {
			*j = *i;
			j--;
		}
	}
	*i = key;
	return i;
}

递归部分

用getindex找到基准数指针和位置后,在对两部分分别进行快排,一部分是从startPointer到index-1,另一部分是从index+1到endPointer
同时写出退出条件,当 startPointer >= endPointer (即只剩一个数时)就不用排了

template <class Record>
void quick_sort(Record* startPointer, Record* endPointer) {
	if (startPointer < endPointer) {
		Record* index = getindex(startPointer,endPointer);
		quick(startPointer,index-1);
		quick(index+1,endPointer);			
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值