算法给小码农计数排序尊者

Posted 小码农UU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法给小码农计数排序尊者相关的知识,希望对你有一定的参考价值。


排序

常见的排序算法 扩展

计数排序 不进行数据的比较,而是统计数据出现的次数

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

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

我们可以发现是不是很快,自我感觉一下,没错实际上的确是很快的,时间复杂度是高效到==O(N)==级别的。计数的本质是哈希,所谓的映射

这也会面临一个很现实的问题,就是前面没有时候数,后面1000的位置反而有数,咋处理

eg.1000 1100 1200 1300 1200 1400 1000 1500 1300 1200

我们也可以发现计数排序比较适合大小范围集中的数组

计数排序

// 计数排序
void CountSort(int* a, int n) 
	assert(a);
	int max = a[0], min = a[0];
	int i = 0;
	for (i = 0; i < n; i++) 
		if (a[i] > max)
			max = a[i];
		if (a[i] < min)
			min = a[i];
	
	//范围
	int range = max - min + 1;
	//开辟计数数组
	int* count = (int*)malloc(sizeof(int) * range);	
	//没开辟成功直接错
	assert(count);
	//数组全部初始化为零
	memset(count, 0, sizeof(int) * range);
	//统计次数
	for (i = 0; i < n; i++) 
		//相对映射加加
		count[a[i] - min]++;
	
	//通过计数数组的次数对原数组进行排序
	int j = 0;
	for (i = 0; i < range; i++) 
		while (count[i]--)
			//相对映射要回到原数组的数据+min
			a[j++] = i+min;
	
	free(count);
	count = NULL;

计数排序的特性总结

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)

测性能

1000 一千

10000 一万

100000 十万

1000000 一百万

10000000 一千万

排序总结

稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且r[i] 在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是最稳定的,否则称为不稳定的

再简单一点:数组中相同的值,在排序以后相对位置是否变化

可能会变的,就是不稳定

能保持不变,就是稳定

八大排序总结

排序方法平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度稳定性
插入排序O(N^2)O(N^2)O(N)O(1)稳定
希尔排序O(N^1.3)O(N^2)O(N)O(1)不稳定
选择排序O(N^2)O(N^2)O(N^2)O(1)不稳定
堆排序O(n*logN)O(n*logN)O(n*logN)O(1)不稳定
冒泡排序O(N^2)O(N^2)O(N)O(1)稳定
快速排序O(n*logN)O(N^2)O(n*logN)最好O(logN),最坏O(N)不稳定
归并排序O(n*logN)O(n*logN)O(n*logN)O(N)稳定
计数排序O(MAX(N,range))O(MAX(N,range))O(N)O(range)不稳定

以上是关于算法给小码农计数排序尊者的主要内容,如果未能解决你的问题,请参考以下文章

算法给小码农插入排序洞天,希尔排序轮回

#yyds干货盘点#算法给小码农归并排序列阵

算法给小码农八大排序 八奇计只为宝儿姐

#yyds干货盘点#算法给小码农冒泡排序铭纹,快速排序四极

#yyds干货盘点#算法给小码农堆排序至尊骨

算法给小码农TopK重瞳双目