数据结构之基数排序
2017-08-04 15:17
387 查看
#include<stdio.h> #include<math.h> 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) //*p为排序数组,n为数组长度,loop为分配次数 { int buckets[10][20] = {}; //定义的缓存区:桶 int tempnum = (int)pow(10,loop-1); //如798个位桶index=(798/1)%10=8 //十位桶index=(798/10)%10=9 //百位桶index=(798/100)%10=7 //tempNum为上式中的1、10、100 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] == 0) { buckets[row_index][j] = *(p+i); //关键步骤之二 break; } } } //将buckets中的数倒回到原数组当中 int k = 0; for(i = 0;i<10;i++) { for(j = 0; j<20; j++) { if(buckets[i][j]!=0) { *(p+k)=buckets[i][j]; //关键步骤之三 buckets[i][j] = 0; //清空 k++; } } } } void bucketsort3(int *p,int n) { int maxnum = findmaxnum(p,n); //获取数组中最大值 printf("maxnum=%d\n",maxnum); int looptimes = getlooptimes(maxnum); //获取最大数的位数,即分配次数 printf("looptimes=%d\n",looptimes); int i; for(i = 1;i<=looptimes;i++) //对个、十、百、千、万......位进行排序 { sort2(p,n,i); } } int main() { int a[] = {2,343,342,1,123,43,4343,433,687,0,654,3,80}; 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]); return 0; }
相关文章推荐
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 数据结构 学习笔记(十一):排序(下):快速 / 表 / 桶 / 基数 排序,排序算法的比较
- 数据结构——链式基数排序
- 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构_内部排序_链式基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- 数据结构_基数排序
- 第16周SHH数据结构-【项目1-验证算法(8)基数排序 】
- 数据结构系列之基数排序
- 【数据结构】算法10.15-10.17 链式基数排序
- Hark的数据结构与算法练习之基数排序
- C++代码,数据结构-内部排序-基数排序-链式基数排序
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 重学数据结构002——桶排序、基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- 数据结构-算法: 基数排序
- 数据结构-冒泡排序和直接插入排序
- 数据结构(1)-选择排序和插入排序
- 《数据结构--排序》之归并排序
- (6)基数排序