简单排序模板

目录

快排模板

归并排序模板

二分排序


快排模板

int q[N];
void quick_sort(int q[],int l,int r){
	if(l>=r) return;	//定出口
	int x = q[l],i = l-1,j = r+1;	//确定比较对象x,左端点i,右端点j.
	while(i<j){	
		do i++; while (q[i]<x);		
		do j--; while (q[j]>x);		
		if (i<j) swap(q[i],q[j]);	
	}
	quick_sort(q,l,j);		//递归思想
	quick_sort(1,j+1,r);
}

tips :

        i = l-1,j = r + 1;端点往两边移动一个位置,是因为一开始就要先移动!

归并排序模板

int q[N],tmp[N];
void merge_sort(int q[],int l,int r){
	if (l>=r) return;
	int mid = l + r >> 1;
	merge_sort(q,l,mid);merge_sort(q,mid+1,r);
	int k = 0,i = 1,j = mid + 1;
    while(i<=mid && j <= r)
    	if (q[i] <= q[j]) tmp[k++] = q[i++];
    	else tmp[k++] = q[j++];
    while (i <= mid) tmp[k++] = q[i++];
    while (j <= r) tmp[k++] = q[j++];
    for (i = l,j = 0;i <= r;i++,j++) q[i] = tmp[j];
}

tips : 

        归并排序是需要开两个数组的,空间换时间。

二分排序

int bsearch_1(int l,int r){
	while (l < r){
		int mid = l + r >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}
	return l;
}

int bsearch_2(int l,int r){
	while (l < r) {
		int mid = l + r + 1 >> 1;
		if (check(mid)) l = mid;
		else r = mid - 1;
	}
	return l;
}

tips : 

        二分排序有两种,这两种区别是由check()的不同所导致的。

        二分的本质不是单调性,只要一个区间中存在一个性质,就可以用二分。 

        浮点数二分的时候循环条件可以改成 l-r >1e-8 ,或者直接循环100次。因为浮点数的比较是存在精度误差的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值