2.3.1 分治法(归并排序)

分治法模式:

分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。
解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
合并这些子问题的解成原问题的解。

对于归并排序:
分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
解决:使用归并排序递归地排序两个子序列。
合并:合并两个已排序的子序列。

算法特征:
时间复杂度为O(nlgn),不稳定排序。

#include <iostream>
#include <limits>
using namespace std;


void MergeSort(int A[], int left, int right);
void Merge(int A[], int left, int mid, int right); 


int main()
{
	int A[] = {2, 4, 5, 7, 1, 2, 3, 6};
	MergeSort(A, 0, 7);
	for(int i = 0; i < 8; i ++)
		cout << A[i] << ' ';
	return 0;
}

void MergeSort(int A[], int left, int right)
{
	int mid;
	if(left < right)
	{
		mid = (right + left) / 2;
		MergeSort(A, left, mid);
		MergeSort(A, mid + 1, right);
		Merge(A, left, mid, right); 
	}
}
 

void Merge(int A[], int left, int mid, int right)
{
	int n1 = mid - left + 1;
	int n2 = right - mid;
	int L[n1 + 1], R[n2 + 1];
	for(int i = 0; i <= n1 - 1; i ++)
		L[i] = A[left + i];
	for(int j = 0; j <= n2 - 1; j ++)
		R[j] = A[mid + 1 + j];
	//INT_MAX整型最大值,当作L和R的结束哨兵 
	//L: 1,2,3,4; R:5,6,7;如果不加最大值哨兵,
	//如这个例子,L的索引会增加到溢出状态 
	L[n1] = INT_MAX;
	R[n2] = INT_MAX;
	int i = 0;
	int j = 0;	
	for(int k = left; k <= right; k ++)
	{
		if(L[i] <= R[j])
		{
			A[k] = L[i];
			i ++;
		}
		else
		{
			A[k] = R[j];
			j ++;
		}
	}
}
输出结果:1 2 2 3 4 5 6 7


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
glibc2.3.1是GNU C Library的一个版本,是一个开源的C库,用于支持基于Linux系统的应用程序。它提供了许多功能和工具,使开发者能够编写高性能和可靠的应用程序。 首先,glibc2.3.1提供了丰富的API,可以用于处理文件、内存、进程、线程等操作。开发者可以使用这些API来编写应用程序,并与操作系统进行交互。此外,glibc2.3.1还提供了各种数据结构和算法的实现,以及对网络编程和多线程编程的支持,使开发者能够轻松地编写复杂的应用程序。 其,glibc2.3.1还提供了对国际化和本地化的支持。开发者可以使用glibc的国际化功能来处理不同语言和地区的字符集、日期、时间等,以便确保应用程序在全球范围内能够正确地运行。 此外,glibc2.3.1还提供了一些安全性的功能,如缓冲区溢出的防护机制和堆栈隔离等。这些功能有助于开发者编写更加安全的应用程序,防止恶意代码的利用。 最后,glibc2.3.1是一个开源项目,可以免费使用和修改。这意味着开发者可以根据自己的需求对其进行定制,并贡献自己的改进和修复。这也使得glibc2.3.1成为开发者们在Linux系统上进行应用程序开发的首选库之一。 总之,glibc2.3.1是一个功能强大、可靠性高的C库,提供了广泛的API和功能,用于支持Linux系统上的应用程序开发。它的存在使得开发者能够更加轻松地编写高性能、可靠和安全的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值