八大排序算法-基数排序

news/2024/5/17 18:13:35 标签: 归并排序, 排序算法

基数排序(radix sort)

定义:

属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。 

分类:

最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

基数排序基本思想:

第一步
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。

时间效率[1]:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。 
空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针。

算法:

#include "stdafx.h"
#include "iostream"
int arr[] = { 35, 28, 58, 10, 61, 58, 97, 17 };
int k = sizeof(arr) / sizeof(arr[0]);

int maxbit(int data[], int n) //辅助函数,求数据的最大位数
{
	int d = 1; //保存最大的位数
	int p = 10;
	for (int i = 0; i < n; ++i)
	{
		while (data[i] >= p)
		{
			p *= 10;
			++d;
		}
	}
	return d;
}
void radixsort(int data[], int n) //基数排序
{
	int d = maxbit(data, n);
	int *tmp = new int[n];
	int *count = new int[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 < n; j++)
		{
			k = (data[j] / radix) % 10; //统计每个桶中的记录数
			count[k]++;
		}
		for (j = 1; j < 10; j++)
			count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
		for (j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
		{
			k = (data[j] / radix) % 10;
			tmp[count[k] - 1] = data[j];
			count[k]--;
		}
		for (j = 0; j < n; j++) //将临时数组的内容复制到data中
			data[j] = tmp[j];
		radix = radix * 10;
	}
	delete[]tmp;
	delete[]count;
}

int _tmain(int argc, _TCHAR* argv[])
{
	radixsort(arr, k);
	for (int f = 0; f < k; f++)
	{
		std::cout << arr[f] << "  ";
	}
	getchar();
	return 0;
}



http://www.niftyadmin.cn/n/1301497.html

相关文章

location.href和location.replace的区别

情景 比如支付过程中或者使用商品的优惠券&#xff0c;而使用这张优惠券需要取请求 一个第三方的地址&#xff0c;中间会有一次跳转。 若使用 window.location.href“url” ,按流程操作是没问题的&#xff0c;但是如果用户点击返回&#xff0c;则无法跳回原本的提交订单的页面…

cocos2dx项目在XCode9下ntfw代替system

日前&#xff0c;有网友看了我的博客后&#xff0c;发消息告诉我遇到一个错误&#xff1a;说是找不到system。当前我的项目是没有问题的&#xff0c;没能找出问题所在。 报错如下&#xff1a;Call to unavailable function system: not available on iOS。写这句话是为了写关键…

微信开发 Java SDK微信公众支付(获取openid)

获取openid 1 第一步&#xff1a;用户同意授权&#xff0c;获取code 2 第二步&#xff1a;通过code换取网页授权access_token 3 第三步&#xff1a;刷新access_token&#xff08;如果需要&#xff09; 4 第四步&#xff1a;拉取用户信息(需scope为 snsapi_userinfo) 5 附&#…

javasript性能提升之WebAssembly和asm.js

文章转载自知乎的罗志宇的回答 作者&#xff1a;罗志宇链接&#xff1a;https://www.zhihu.com/question/31415286/answer/58022648来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。下面要讲的&#xff0c;其实是一个悲伤…

asm.js 和 Emscripten 入门教程

文章转载自&#xff1a;http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html Web 技术突飞猛进&#xff0c;但是有一个领域一直无法突破 ---- 游戏。 游戏的性能要求非常高&#xff0c;一些大型游戏连 PC 跑起来都很吃力&#xff0c;更不要提在浏览器的沙盒模型里跑…

github clone报错Conection refused

最近&#xff0c;因为要配置emscripten的环境&#xff0c;从github从clone一个项目下来&#xff0c;但是出现以下报错&#xff1a; fatal: unable to access https://github.com/juj/emsdk.git/: Failed to connect to 192.168.11.9 port 1087: Connection refused 于是放狗&a…

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could

报错信息&#xff1a; java.lang.Object.wait(Native Method)java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)com.mysql.jdbc.NonRegisteringDriver$1.run(NonRegisteringDriver.java:93) 2019-02…