快速排序C实现

快速排序

思维卡点

数组中与对照值相等的值,无论放对照值的左边或者右边都是没问题的

数组中与对照值相等的值,刚开始存放的位置很迷惑;这个问题想通了,代码实现就清晰了.

细节注意点

  1. 对照值选取;(本文标记为p)
  2. 对照值在数组中的位置维护;(本文标记为p_inx)
  3. 满足循环的条件双遍历下标s,e需要满足s<=e;(本文中s的初始化为数组的起始下标,e为数组的结束下标)
  4. 循环体首要先判断是否s==e;(满足处理数组长度只有2个的场景)
  5. nums[p]>=nums[s]的情况都需要移动s,进行s++;
  6. nums[p]<=nums[e]的情况都需要移动e,进行e–;
  7. 处理s==e的情景时,如果nums[p]>nums[e],直接交换并且返回e;
  8. 如果nums[p]<=nums[e],交换e-1与p的值,返回e-1;
  9. 然后再分治;

C代码

int get_final_index(void **list, int s, int e, compare comp);
void swap(void **list, int a, int b);
void quick_sort(void **list, int start, int end, compare comp);

typedef int (*compare)(void *,void *);
int get_final_index(void **list, int s, int e, compare comp)
{
	int fi;
	int p_inx;
	if ( e - s + 1 < 2 ) {
		return s;
	}
	p_inx = s;
	s++;
	while(s <= e) {
		if( s == e ) {
			if(comp(list[p],list[e]) > 0) {
				swap(list, p, e);
				return e;
			}
			swap(list, p, e-1);
			return e-1;
		}
		if (comp(list[p],list[s])>=0) {
			s++;
			continue;
		}
		if (comp(list[p],list[e])<=0) {
			e--;
			continue;
		}
		swap(list, s, e);
	}
	return p;
}
void quick_sort(void **list, int start, int end, compare comp)
{
	int fi;
	if(start >= end)
		return;
	fi = get_final_index(list, start, end, comp);
	quick_sort(list, start, fi - 1, comp);
	quick_sort(list, fi + 1, end, comp);
}

void swap(void **list, int a, int b)
{
	void* tmp = NULL;
	if(a==b) 
		return;
	tmp = list[a];
	list[a] = list[b];
	list[b] = tmp; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值