非比较排序
2016-04-10 13:50
239 查看
非比较排序有:1.计数排序(适用于要排序的数的范围不大时) ,以数组中的数据为key值,得到它们出现的次数,
然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。
2.基数排序 LSD-- Least Significant Digit first
MSD-- Most Significant Digit first , 首先根据个位的数值,在遍历数组数据时将他们 分配到0~9号的桶(个位与桶号一一对应)中,接下来将桶中按桶号由小到大一次重新收集到数组中,接着,再根据十位上的数值进行分配,重复这个过程,直到排到最大位的数据,得到有序数列。
实现代码如下:
1.计数排序:
2.基数排序:
然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。
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++; } }
相关文章推荐
- WebViewJavascriptBridge详细使用
- 第七周项目1—两点间的距离(友元函数)
- hdoj1175 连连看
- Word转PDF图像失真的解决方法
- Burp Suite 是用于攻击web 应用程序的集成平台
- javaweb学习总结(十)——HttpServletRequest对象(一)
- 文章标题
- ViewPager的使用方法
- 共享内存的特殊文件系统
- python中np.random.randint()
- 邁向IT專家成功之路的三十則鐵律 鐵律九:IT人社群互動之道-縮小自己
- WebSocket 介绍(二)-WebSocket API
- ModernUI教程:如何使用你自己的导航框架
- 重构第22天 分解方法(Break Method)
- 在类中使用typedef定义新类型, 并在类外使用
- POJ2393-Yogurt factory
- LInux中VIM的使用和定制
- Linux 工程编译调试Makefile及技巧
- Android Studio的git功能的使用
- 隐藏字