算法四:分治(归并排序和快速排序经典代码)

分治思想概念

在这里插入图片描述
在这里插入图片描述
其中会涉及到递归和二分思想,废话不多说,直接上干货

例题一、归并排序

之前也提到了,归并就是把一个大数据分成两组,分别对两组排序然后不断细分直到只剩1个元素时,然后把每每对半分的数据组合并形成有序数组

#include<stdio.h>

void Merge(int a[], int s, int m, int e, int tmp[])
{
	int pb = 0;
	int p1 = s, p2 = m + 1;
	while(p1 <= m && p2 <= e)
	{
		if(a[p1] < a[p2])
			tmp[pb++] = a[p1++];
		else
			tmp[pb++] = a[p2++];
	}
	while(p1 <= m)
		tmp[pb++] = a[p1++];
	while(p2 <= e)
		tmp[pb++] = a[p2++];
	int i;
	for(i = 0; i < e - s + 1; i++)
		a[s + i] = tmp[i];
}

void MergeSort(int a[], int s, int e, int tmp[])
{
	if(s < e)
	{
		int m = s + (e - s) / 2;
		MergeSort(a, s, m, tmp);
		MergeSort(a, m + 1, e, tmp);
		Merge(a, s, m, e, tmp);
	}
}

int a[10] = {13, 27, 19, 2, 8, 12, 2, 8, 30, 89};
int b[10];

int main()
{
	int size = sizeof(a) / sizeof(int);	//算出数组a须排序的元素个数 
	MergeSort(a, 0, size - 1, b);
	int i;
	for(i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
} 

运行结果如下:
在这里插入图片描述
在这里插入图片描述

例题二、快速排序

在这里插入图片描述
比方说对于序列7 1 3 8 12 11 2 9,第一次快排,分析如下
在这里插入图片描述

#include<stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void QuickSort(int a[], int s, int e)
{
	if(s >= e)
		return;
	int k = a[s];
	int i = s, j = e;
	while(i != j)
	{
		while(j > i && a[j] >= k)
		{
			--j;
		}
		swap(&a[i], &a[j]);
		while(i < j && a[i] <= k)
		{
			++i;
		}
		swap(&a[i], &a[j]);
	}
	QuickSort(a, s, i - 1);
	QuickSort(a, i + 1, e);
}


int main()
{
	int a[] = {7, 1, 3, 6, 12, 11, 2, 9};
	int size = sizeof(a) / sizeof(int);
	QuickSort(a, 0, size - 1);
	int i;
	for(i = 0; i < size; ++i)
		printf("%d, ", a[i]);
	printf("\n");
	return 0;
} 

当然,要注意,快排效率高的情况出现在左右两边数字的数目基本相同的情况下

这里还有一个关于二分查找与快排的结合的题目:找一对数,详情可翻看算法三:二分查找(与快排相结合)

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值