排序算法3:归并排序与计数排序

前言

Hello,小伙伴们,今天我们继续排序算法的学习,大家三连上车不迷路,我们现在开始今天的学习!!!

1.归并排序

 1.1归并排序的算法思想

归并排序(MERGE_SORT)是建立在归并的一种游戏哦的排序算法中华给的中庸正科级。

 该算法算是一种采用分治法(Divide and Conquer)的一种典型的用法。将已有的子序列合并,得到完全有序的序列;即先是每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序核心步骤:

1.2 代码实现:

 根据上面的思路,我们需要运用二叉树的概念将一个数组分成许多的子数列,之后再进行逐步的合并递归排序。

我们先来看看代码:

void _MergeSort(int* arr, int left, int right, int* tmp)
{
	//归并操作
	if (left >= right)
		return;
	int mid = (left + right) / 2;
//与二叉树递归的思想相近!!
	_MergeSort(arr, left, mid, tmp);
	_MergeSort(arr, mid + 1, right, tmp);
	//合并序列
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int index = 0;
//升序排序
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (arr[begin1] < arr[begin2])
			tmp[index++] = arr[begin1++];
		else
		{
			tmp[index++] = arr[begin2++];
		}
		for (int i = left; i < right; i++)
		{
			arr[i] = tmp[i];
		}
	}
	//要么数组1越界,要么数组二越界
	while (begin1 <= end1)
	{
		tmp[index++] = arr[begin1];
	}
	while (begin2 <= end2)
	{
		tmp[index++] = arr[begin2];
	}
	//合并完成
}
void MergeSort(int* arr, int n)
{
	//归并操作
	int* tmp = (int*)malloc(sizeof(int) * n);
	_MergeSort(arr, 0, n - 1, tmp);
	free(tmp);
}

 这个运用了二叉树的结构性质,我们在学习了二叉树后就能十分轻松地理解并运用归并排序的思路了。

接下来,我们来测试一下,我们大代码:

这样我们的归并排序,就实现完成了。 

2.计数排序

2.1计数排序的原理

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。操作步骤:

  1. 统计相同元素出现的次数
  2. 根据·统计的结果·将序列会受到原来的序列中。

2.2代码实现:

 

void CounntSort(int* arr, int n)
{
	//找出最大值和最小值
	int min =arr[0];
	int max = arr[0];
	for (int i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
		if (arr[i] < min)
		{
			min = arr[i];
		}
	}
	int* tmp = (int*)malloc(sizeof(int) * (max - min + 1));
	if (tmp == NULL)
	{
		perror("malloc Fail!!\n");
		exit(1);
	}
	int range = max - min + 1;
	//初始化数组中的元素
	memset(tmp, 0, sizeof(int) * (range));
//实现通过下标与时间的映射
	for (int i = 0; i < n; i++)
	{
		tmp[arr[i] - min]++;
	}
	int index = 0;
	for (int i = 0; i < range; i++)
	{
		//将tmp数组中的数值映射拷贝到数组中
			while (tmp[i]--)
			{
				arr[index++] = i + min;
			}
		
	}
}

计数排序的算法思想相较于其他的排序算法,较为特殊,使用的 场景也很局限,主要是因为他是特殊的非比较排序,在处理整数上能够有过人的表现,但是无法处理浮点数!!

我们来测试一下我们写的代码:

 

好,今天的学习就到这里,我们下期再见,拜拜!!! 

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值