二分排序与二分查找

本文介绍了分治法在排序和查找中的应用,详细阐述了归并排序和快速排序的实现原理,以及它们在逆序对数计算和寻找第k小数中的应用。同时,讨论了二分查找的实现,包括递归和非递归方式,并扩展到lower_bound和upper_bound的概念。文章强调了分治法的核心思想及其在解决问题中的具体技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、规定排序的实现

      分治法的三步法:

          划分问题:(把序列二分),

          递归求解:(分别对左右子序列递归排序)

          合并结果:(根据左右两个有序的子序列,依次取两个子序列的最小元素中的最小者加到结果中去)

      实现如下:

#include <iostream>
using namespace std;

void mergeSort(int * a, int x, int y, int * t)//归并排序,t为辅助空间
{
	if(y-x > 1)//由于是区间[x,y),非空则有y-x>=1,而1个元素的子序列已经有序
	{
		int m = x + (y-x)/2;//中点
		mergeSort(a,x,m,t);
		mergeSort(a,m,y,t);
		
		//合并
		int p = x, q = m, k = x;
		while(1)
		{		
			if(p < m){//左非空
				if(q < y){//右非空
					if(a[p] < a[q]) t[k++] = a[p++];
					else t[k++] = a[q++];
				}
				else t[k++] = a[p++];
			}
			else{//左空
				if(q < y){//右非空
					t[k++] = a[q++];
				}//右空
				else break;
			}
		}
		for(int i = x; i < y; i ++) a[i] = t[i];
	}
}

int main()
{
	int n;
	int a[100], t[100];
	cin >> n;
	for(int i = 1; i <= n; i ++) scanf("%d",&a[i]);	//输入数据

	mergeSort(a,1,n+1,t);

	for(int i = 1; i <= n; i ++) printf("%d ",a[i]);
	printf("\n");
	
	return 0;
}

    归并排序最主要的就是合并的时候的选择最小的元素添加到结果中的适当位置去。

 

2、归并排序的一个应用——逆序对数

   &nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值