非比较排序
来源:互联网 发布:mysql 自动分区 编辑:程序博客网 时间:2024/06/05 08:16
非比较排序有:1.计数排序(适用于要排序的数的范围不大时) ,以数组中的数据为key值,得到它们出现的次数,
然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。
2.基数排序 LSD-- Least Significant Digit first
MSD-- Most Significant Digit first , 首先根据个位的数值,在遍历数组数据时将他们 分配到0~9号的桶(个位与桶号一一对应)中,接下来将桶中按桶号由小到大一次重新收集到数组中,接着,再根据十位上的数值进行分配,重复这个过程,直到排到最大位的数据,得到有序数列。
实现代码如下:
1.计数排序:
void CountSort(int *a, size_t size){assert(a);int max = a[0];int min = a[0];for (int i = 0; i < size; i++){if (a[i] > max){max = a[i];}else if (a[i] < min){min = a[i];}}int len = max - min + 1;int *countArr = new int[len];memset(countArr, 0, sizeof(int)*len);for (int i = 0; i < size; i++){countArr[a[i] - min]++;}int tmp = 0;for (int i = 0; i < len; i++){while (countArr[i]--){a[tmp++] = i + min;}}}
2.基数排序:
int GetMaxDigit(int *a, size_t size){int digit = 1;int max = 10;for (int i = 0; i < size; i++){if (a[i] >= max){digit++;max *= 10;}}return digit;}//基数排序void LSDSort(int *a, size_t size){int maxdigit = GetMaxDigit(a, size);int *bucket = new int[size];int count[10];int start[10];int bit = 1;int digit = 1;while (bit <= maxdigit){memset(count, 0, sizeof(int)* 10);memset(start, 0, sizeof(int)* 10);for (int i = 0; i < size; i++){int num = (a[i]/digit) % 10;count[num]++;}start[0] = 0;for (int i = 1; i < size; i++){start[i] = start[i - 1] + count[i - 1];}for (int i = 0; i < size; i++){int num = (a[i] / digit) % 10;bucket[start[num]++] = a[i];}memcpy(a, bucket, sizeof(int)*size);digit *= 10;bit++;}}
1 0
- 非比较排序 [Algorithm]
- 非比较排序
- 非比较排序
- 非比较排序
- 非比较排序
- 非比较排序
- 非比较排序学习
- 非比较排序算法
- 计数排序 --非比较排序
- 非比较排序---【归并排序】
- 排序小结(非比较)
- 基数排序----非比较型排序
- 内部非比较排序---基数排序
- 非比较排序——计数排序
- 非比较排序——桶排序
- 计数排序---非比较型排序
- 内部非比较排序---桶排序
- 内部非比较排序---计数排序
- 寻找直方图中最大矩形
- 设计模式介绍
- 分类算法之朴素贝叶斯分类(Naive Bayesian classification)
- Java - JSON
- MyBatis学习笔记四——解决字段名与实体类属性名不相同的冲突
- 非比较排序
- comparable 和 comparator
- eclipse+Tomcat+JSP+oracle连接数据库
- 第6周项目2-带武器的游戏角色
- 学习bootstrap框架的demo
- 【arduino】通过Esp8266-01模块实现的WiFi通信(1)简介和搭建编程环境
- 我的记录
- Opencv学习之零碎记录
- React-native Redux 干货分享实践