计数排序和基数排序
来源:互联网 发布:帕克斯软件 编辑:程序博客网 时间:2024/06/06 06:30
计数排序
计数排序是一种高效的线性排序,通过计算一个集合中元素出现的次数来确定集合如何排列,适用于可以用整型来表示的数据集合,还需要知道集合中最大整数的值,以便事先分配空间。
C语言实现
#include <stdlib.h>#include <string.h>#include "sort.h"// @param data为待排序集合// @param size为data大小// @param k为集合中最大整数加1int ctsort( int *data, int size, int k ){ int *counts, *temp; int i, j; // 为计数器分配空间 if( ( counts = (int*)malloc( k*sizeof(int) ) ) == NULL ) return -1; // 为结果数组分配空间 if( ( temp = (int*)malloc( size*sizeof(int) ) ) == NULL ) return -1; // 初始化 for( i = 0; i < k; i++ ) counts[i] = 0; // 计数 for( j = 0; j < size; j++ ) counts[data[j]]++; // 累计每个位置之前的元素总数 for( i = 1; i < k; i++ ) counts[i] += counts[i-1]; // 根据counts确定每个元素的位置 for( j = size-1; j >= 0; j-- ) { temp[counts[data[j]] - 1] = data[j]; counts[data[j]]--; } // 复制结果 memcpy( data, temp, size*sizeof(int) ); // 清空存储空间 free( counts ); free( temp ); return 0;}
基数排序
将数据按位分开,并从数据的最低有效为到最低有效位进行比较,依次排序。基数排序会用到计数排序,必须知道每一位的最大整数值。
基数排序并不局限于对整型数据进行排序,只要能把元素分割成整型数,就可以使用基数排序,例如可以以
具体选择什么值作为基数,取决于数据本身,同事考虑空间的限制,需要将pn + pk最小化,其中,p为每个元素的位数,n为元素的个数,k为基数,通常 k <= n
#include <limits.h>#include <math.h>#include <stdlib.h>#include <string.h>#include "sort.h"// @param data为待排序集合// @param size数据集大小// @param p每个元素的位数// @param k基数int rxsort( int* data, int size, int p, int k ){ int *counts, *temp; int index, pval, i, j, n; if( (counts = (int*)malloc(k*sizeof(int)) ) == NULL ) return -1; if( (temp = (int*)malloc(size*sizeof(int))) == NULL ) return -1; // 从低位到高位排序 for( n = 0; n < p; n++ ) { for ( i = 0; i < k; i++ ) counts[i] = 0; pval = (int)pow( (double)k, (double)n ); for( j = 0; j < size; j++ ) { index = (int)(data[j] / pval) % k; counts[index]++; } for( i = 1; i < k; i++ ) counts[i] += counts[i-1] for( j = size-1; j>= 0; j-- ) { index = (int)(data[j] / pval ) % k; temp[counts[index]-1] = data[j]; counts[index]--; } memcpy( data, temp, size*sizeof(int) ); } free(counts); free(temp); return 0;}
阅读全文
0 0
- 计数排序和基数排序
- 计数排序和基数排序
- 基数排序和计数排序
- 计数排序和基数排序
- 计数排序和基数排序
- 计数排序和基数排序
- 计数排序和基数排序
- 计数排序和基数排序
- 计数排序和基数排序
- 计数排序和基数排序
- Java 基数排序和计数排序
- 计数排序和基数排序和桶排序
- 计数排序、桶排序和基数排序
- 计数排序、桶排序和基数排序
- 计数排序、桶排序和基数排序
- 计数排序,基数排序和桶排序
- 计数排序、桶排序和基数排序
- 大话桶排序 基数排序和计数排序
- SpringData JPA 使用SQLQuery原生
- 车牌识别之Java语言 eclipse开发工具的车牌识别项目
- Vuejs学习之-----vue-router实现路由功能
- java 7 中 static 的用法
- Intellij2017关联jar包和源码
- 计数排序和基数排序
- 二叉树总结
- Linux 环境下编译安装MySQL5.6
- JDK8下maven使用maven-javadoc-plugin插件报错
- learning之享元模式
- JavaScript为动态生成的标签绑定事件-参数
- android wifi调试
- Android Wi-Fi 无缝漫游 Seamless Roaming
- C++11Lambda捕获列表使用