九大排序之——计数排序
来源:互联网 发布:oppoa77t怎么切换网络 编辑:程序博客网 时间:2024/06/02 19:42
计数排序
计数排序步骤:
(1)找出待排序的数组中最大和最小的元素;
(2)统计数组中每个值为i的元素的出现的次数,存入数组C的第i项;
(3)对所有的计数累加;
(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1;
图示:
代码实现:
void CountSort(int* arr, size_t n){assert(arr);int max = 0;for (size_t i = 0; i < n; i++){if (arr[i]>max)max = arr[i];}//计数数组int* tmp = new int[max + 1];memset(arr, 0, sizeof(int)*(max + 1));for (size_t i = 0; i < n; i++){tmp[arr[i]]++;}int index = 0;for (size_t i = 0; i <= max; i++){while (tmp[i]--){arr[index] = i;++index;}}delete[] tmp;}
时间复杂度&空间复杂度&稳定性
时间复杂度:O(N+k) ----k是要排序的数组的范围
空间复杂度:O(k)
稳定性:稳定
计数排序优化
类似于直接哈希算法,当数组中的元素不是从最小的数开始的,而是像(1000,1002,1003,1004,1000)这样的数组采用计数排序时,如果我们依旧是开辟最大数+1的空间时,就会使前面的空间全部浪费,因此应该找出最大值和最小值,两者相减就会得到对应的临时数组空间的大小,然后对其进行相应的映射,得到排好序的有序序列。
计数排序优化代码实现:
void CountSort(int* arr, size_t n){assert(arr);int max = arr[0];int min = arr[0];for (size_t i = 0; i < n; i++){if (arr[i] > max)max = arr[i];if (arr[i] < min)min = arr[i];}//确定要开辟数组的大小int range = max - min + 1;int* tmp = new int[range];for (size_t i = 0; i < n; i++){tmp[arr[i] - min]++;}//考回原数组int index = 0;for (size_t i = 0; i < range; i++){while (tmp[i]--){arr[index] = i + min;index++;}}delete[] tmp;}
阅读全文
0 0
- 九大排序之——计数排序
- 九大排序之——基数排序
- 九大排序之——希尔排序
- 九大排序之——冒泡排序
- 九大排序之——堆排序
- 九大排序之——选择排序
- 九大排序之——插入排序
- 九大排序之——快速排序
- 九大排序之——归并排序
- 算法——排序之计数排序
- 三大线性排序之计数排序
- 十大排序算法之计数排序
- 基础算法系列(九)排序算法之计数排序
- 排序之计数排序
- 排序——计数排序
- 算法分析之——计数排序
- 计数排序—Java
- 排序算法之 —— 计数排序法(八)
- PHP + AJAX实现幸运转盘抽奖
- Android开发(一、初窥安卓--1.创建项目)
- H264系列(10):GOP之M和N值介绍
- Android——Jsoup工具类(图片,标题,时间等的获取)
- bootstrap中常用的一些样式制作(自我总结)
- 九大排序之——计数排序
- Python 2.7 连接MongoDB
- 【编程素质】设计模式-其它
- FTP配置
- 电话号码对应的字符组合
- hdu 1034 & poj 1077 Eight 传说中的八数码问题。真是一道神题,A*算法+康托展开
- Unity打包安卓添加依赖工程
- github使用总结
- 二叉排序树(二叉搜索、查找树)(BST树)