当前位置: 首页 > 手游 > 保卫萝卜4

❤️【全网最全排序算法4 附动图演示(c++版本)】❤️

来源:网络 时间:2022-10-27 11:38:00
导读五分钟学习三个排序小算法!!!学习不累,效率翻倍!!!8、计数排序(Counting Sort) 8.1 算法描述计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线…

五分钟学习三个排序小算法!!!

学习不累,效率翻倍!!!

8、计数排序(Counting Sort)

8.1 算法描述

计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

具体算法描述:

  • 找出待排序的数组中最大和最小的元素;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

8.2 动图演示

8.3 代码实现

void CountingSort(vector<int> &arr,int maxValue) {
	vector<int> bucket(maxValue + 1,0);
	int	sortedIndex = 0;
	int arrLen = arr.size();
	int	bucketLen = maxValue + 1;

	for (int i = 0; i < arrLen; i++) {
		if (!bucket[arr[i]]) {
			bucket[arr[i]] = 0;
		}
		bucket[arr[i]]++;
	}

	for (int j = 0; j < bucketLen; j++) {
		while (bucket[j] > 0) {
			arr[sortedIndex++] = j;
			bucket[j]--;
		}
	}
}

9、桶排序(Counting Sort)

9.1 算法描述

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

算法具体描述:

  • 设置一个定量的数组当作空桶;
  • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • 对每个不是空的桶进行排序;
  • 从不是空的桶里把排好序的数据拼接起来。

9.2 图片演示

9.3 代码实现

//桶排序
void BucketSort(vector<int> &arr,int bucketSize) {
	if (arr.size() == 0) {
		return ;
	}

	int i;
	int minValue = arr[0];
	int maxValue = arr[0];
	for (i = 1; i < arr.size(); i++) {
		if (arr[i] < minValue) {
			minValue = arr[i];                // 输入数据的最小值
		}
		else if (arr[i] > maxValue) {
			maxValue = arr[i];                // 输入数据的最大值
		}
	}

	// 桶的初始化
	int DEFAULT_BUCKET_SIZE = 5;            // 设置桶的默认数量为5
	bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
	int bucketCount = (maxValue - minValue) / bucketSize + 1;
	vector<int> tmp;
	vector<vector<int>> buckets(bucketCount, tmp);


	// 利用映射函数将数据分配到各个桶中
	for (i = 0; i < arr.size(); i++) {
		buckets[(arr[i] - minValue) / bucketSize].push_back(arr[i]);
	}

	arr.resize(0);
	for (i = 0; i < buckets.size(); i++) {
		InsertionSort(buckets[i]);                      // 对每个桶进行排序,这里使用了插入排序
		for (int j = 0; j < buckets[i].size(); j++) {
			arr.push_back(buckets[i][j]);
		}
	}
}

10、基数排序(Radix Sort)

10.1 算法描述

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

算法具体描述:

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

10.2 动图演示

10.3 代码实现

int Maxbit(vector<int> &data)
{
	int d = 1; //保存最大的位数
	int p = 10;
	for (int i = 0; i < data.size(); ++i)
	{
		while (data[i] >= p)
		{
			p *= 10;
			++d;
		}
	}
	return d;
}
void Radixsort(vector<int> &data) //基数排序
{
	int d = Maxbit(data);
	vector<int> tmp(data.size(), 0);
	int count[10]; //计数器
	int i, j, k;
	int radix = 1;
	for (i = 1; i <= d; i++) //进行d次排序
	{
		for (j = 0; j < 10; j++)
			count[j] = 0; //每次分配前清空计数器
		for (j = 0; j < data.size(); j++)
		{
			k = (data[j] / radix) % 10; //统计每个桶中的记录数
			count[k]++;
		}
		for (j = 1; j < 10; j++)
			count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
		for (j = data.size() - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
		{
			k = (data[j] / radix) % 10;
			tmp[count[k] - 1] = data[j];
			count[k]--;
		}
		for (j = 0; j < data.size(); j++) //将临时数组的内容复制到data中
			data[j] = tmp[j];
		radix = radix * 10;
	}
}

二、原文链接

原文太长啦,兄弟怕各位眼疲劳了,所以特意拆解成了一个系列供大家阅读,

五分钟一篇文,就像是饭后甜点一样可口!

要想一次看完,也可以去博客查看收藏原文。

❤️❤️❤️ 如果本文对你有所帮助,请不要忘了点赞、关注、收藏一键三连哦!!!❤️❤️❤️

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:704559159@qq.com

Top
加盟网