基数排序----非比较型排序
2014-02-17 17:44
239 查看
testBS() { int a[] = {2,343,342,1,123,43,4343,433,687,654,3}; int *a_p = a; //计算数组长度 int size = sizeof(a)/sizeof(int); //基数排序 bucketSort3( a_p , size ); //打印排序后结果 int i ; for(i = 0 ; i < size ; i++ ) { printf("%d\n ",a[i]); } int t; scanf("%d",t); } //基数排序 void bucketSort3(int *p , int n) { //获取数组中的最大数 int maxNum = findMaxNum( p , n ); //获取最大数的位数,次数也是再分配的次数。 int loopTimes = getLoopTimes(maxNum); int i ; //对每一位进行桶分配 for( i = 1 ; i <= loopTimes ; i++) { sort2(p , n , i ); } } //获取数字的位数 int getLoopTimes(int num) { int count = 1 ; int temp = num/10; while( temp != 0 ) { count++; temp = temp / 10; } return count; } //查询数组中的最大数 int findMaxNum( int *p , int n) { int i ; int max = 0; for( i = 0 ; i < n ; i++) { if(*(p+i) > max) { max = *(p+i); } } return max; } //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果 void sort2(int *p , int n , int loop) { //建立一组桶 此处的20是预设的 根据实际数情况修改 int buckets[10][20] = {} ; //求桶的index的除数 //如798 个位桶index = ( 798 / 1 ) % 10 = 8 // 十位桶index = ( 798 / 10 ) % 10 = 9 // 百位桶index = ( 798 / 100 ) % 10 = 7 // tempNum 为上式中的1、10、100 int tempNum = (int) pow(10 , loop-1); int i , j ; for( i = 0 ; i < n ; i++ ) { int row_index = (*(p+i) / tempNum) % 10; for(j = 0 ; j < 20 ; j++) { if(buckets[row_index][j] ==NULL) { buckets[row_index ][j] = *(p+i) ; break; } } } //将桶中的数,倒回到原有数组中 int k = 0 ; for(i = 0 ; i < 10 ; i++) { for(j = 0 ; j < 20 ; j++) { if(buckets[i][j] != NULL) { *(p + k ) = buckets[i][j] ; buckets[i][j]=NULL; k++; } } } }
一句话说清楚:
从个位到高位按位进行排序
相关文章推荐
- 基数排序总结
- 基数排序算法之Java实现
- 第十六周项目1-验证算法(8)基数排序
- 第十六周【项目一-(8)基数排序】
- [减治/迭代]基数排序 radix sort
- 第十六周项目1(6)--验证算法之基数排序
- Java算法之基数排序
- 学习基数排序心得
- (C语言)八大排序之:基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- 排序之表排序、基数排序及所有排序算法比较
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 插入,选择,交换,归并,基数排序
- 快速排序,归并排序,堆排序,基数排序,插入排序,希尔排序,
- 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid
- 排序算法总结(4)——归并排序、基数排序
- 项目1.6 基数排序
- 第十六周——【项目4 - 英文单词的基数排序】
- 排序和查找-基数排序 Radix Sorting