十大基础排序 · 八 --- 计数排序
来源:互联网 发布:html数据库添加div 编辑:程序博客网 时间:2024/06/05 14:49
我也来写一篇排序的博客吧,看这个算法的有些博文推荐靠前但是写的有点乱,把自己的代码分享出来,让读者有更多的选择和思考;
虽然是个简单的小程序,若有更好的实现方法,欢迎交流探讨。
1. 简介
计数排序(CountSort)
时间复杂度: O(n) 空间复杂度:O(k)
适用场合: 数字在一定范围内,且分布密集或重复次数高;
分析:
1. 找到数组的最大最小值!(数字范围不一定是从 0~n,可能从 m~n)
2. 一个计数数组, 遍历一个带排数组,完成计数!
3. 通过计数数组中元素的值,得到每个元素的个数,放到待排数组中去!
4. 完成
例子:
原数组:4,4,5,6,5,5,6,6,5
MIn = 4, Max = 6;
pArrCount = {2,4,3} ==> 4+{0 0 1 1 1 1 2 2 2} => [4 4 5 5 5 5 6 6 6 ]
实现方法:3个for循环
2. 实现
void CountSort(int* arr, int nLength){ if(arr == NULL || nLength <= 0) { printf("CountSort :invalid input!\n"); return ; } int i; //1. 找到数组的最大最小值 int Min = arr[0]; int Max = arr[0]; for(i =1; i<nLength; i++) { if(arr[i] < Min) Min = arr[i]; if(arr[i] > Max) Max = arr[i]; } //2. 来一个计数数组, 遍历待排数组,完成计数! int* pArrCount = (int*)malloc(sizeof(int)*(Max - Min + 1)); memset(pArrCount,0,(Max - Min +1)*sizeof(int)); for(i = 0; i< nLength; i++) { pArrCount[ arr[i]-Min ]++; } //3.通过计数数组中元素的值,得到每个元素的个数,放到待排数组中去! int nIndex = 0; for(i = 0; i< nLength; i++) { if(pArrCount[nIndex] > 0) { arr[i] = nIndex + Min; pArrCount[nIndex]--; } else { nIndex++; i--; //这次没进行赋值,但是一会i++就会跳过一位! } } free(pArrCount); pArrCount = NULL;}
阅读全文
1 0
- 十大基础排序 · 八 --- 计数排序
- 十大排序算法之计数排序
- 十大基础排序 · 九 --- 桶排序(不稳定)
- 十大基础排序 · 六 --- 堆排序(不稳定)
- 十大基础排序 · 五 --- 选择排序(不稳定)
- 十大基础排序 · 二 --- 希尔排序(不稳定)
- 【基础排序】计数排序
- 十大基础排序 · 十 --- 基数排序(稳定)
- 排序算法十:计数排序
- Java十大经典基础排序算法
- 排序算法系列十(计数排序)
- 十大基础排序 · 三 --- 冒泡排序(稳定 ,常规写法)
- 十大基础排序 · 一 --- 直接插入排序(稳定)
- 十大排序算法
- 十大排序算法
- 十大排序算法
- 十大排序算法
- 十大经典排序
- Android自定义自己的动画插补器
- Jmeter使用技巧集锦
- 入门训练 Fibonacci数列 圆的面积 序列求和 A+B问题
- Java解析XML
- ubuntu 下搭建tftp服务
- 十大基础排序 · 八 --- 计数排序
- jQuery实现星星评价+ng实现日期
- 数据结构---串(KMP算法)
- http中Post、Get方式的区别
- 『异常』浏览器报ERR_UNSAFE_PORT
- ubuntu 16.04 +caffe+anaconda (CPU) 安裝詳細教程
- Linux常见编译系统总结
- 闭包
- 地址解析协议ARP