计数排序和基数排序
2010-12-03 17:09
162 查看
typedef unsigned int Uint; // =================================================================== // 计数排序 // k: a中最大元素值+1 // 对每一个输入元素x,确定出小于x的元素个数.则x的位置在元素个数+1处 // 注意,排序后的数组b中,b[0]为空元素,实际排序好的数从b[1]开始 // =================================================================== void counting_sort(Uint *a,Uint *b,Uint k,Uint length) { Uint i,j; Uint *p = (Uint *)malloc(k * sizeof(Uint)); for(i = 0; i < k; i++) *(p + i) = 0; // 数组清0 for(j = 0; j < length; j++) { *(p + *(a + j)) += 1; } for(i = 1; i < k; i++) { *(p + i) = *(p + i) + *(p+i-1); } for(j = length -1; j != ~0; j--) // 从大到小,可保持稳定性 { *(b+ *(p + *(a + j))) = *(a + j); *(p + *(a + j)) -= 1; } free(p); } // =================================================================== // 为基数排序准备的计数排序 // a:原数组 b: 基数组 k:b中元素最大值+1 length:a,b的长度 // 注意,排好序的数组从result[1]开始 // =================================================================== void counting_sort_for_RS(int *a, int *b,int k,int length) { int i; int *pCount = (int *)malloc(k * sizeof(int)); // 计数数组 int *result = (int *)malloc((length + 1) * sizeof(int)); // 排序结果临时存储 // clear pCount for(i = 0; i < k; i++) pCount[i] = 0; // count the number of pCount for(i = 0; i < length; i++) { pCount[b[i]]++; } // 确定不大于该位置的个数 for(i = 1; i < k; i++) pCount[i] += pCount[i - 1]; // 排序 for(i = length -1; i >= 0; i--) { result[pCount[b[i]]] = a[i]; pCount[b[i]]--; } // 回写到a中 for(i = 1; i <= length; i++) a[i - 1] = result[i]; free(pCount); } // =================================================================== // 基数排序 // =================================================================== void radix_sort(int *a,int length) { int *pData = (int *)malloc(sizeof(int)*length); // 保存基数 int BaseNumber = 1; bool rsIsOk = 0; while(!rsIsOk) { rsIsOk = 1; // 初始设置为已完成,若取基数的时候取到有不为0的数,则修改为未完成 BaseNumber *= 10; for(int i = 0; i < length; i++) { pData[i] = a[i] % BaseNumber; pData[i] = pData[i] / (BaseNumber / 10); if(pData[i] > 0) rsIsOk = 0; // 未完成 } if(rsIsOk) break; counting_sort_for_RS(a,pData,10,length); } free(pdata); }
相关文章推荐
- 八大排序学习之八分配排序(计数排序、桶排序、基数排序}
- 基础数据结构算法_计数排序,基数排序,桶排序
- 基数排序(基于计数排序)
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 数据结构 28 排序 计数排序 基数排序 桶排序
- radix sort 基数排序 和 counting sort 计数排序
- 三种线性排序算法: 计数排序、桶排序与基数排序
- 计数排序,基数排序,桶排序算法
- 排序算法(计数排序,基数排序,桶排序)
- 非比较排序-----计数排序,基数排序。
- 线性排序算法(计数排序,基数排序,桶排序)分析及实现
- 源码系列:计数排序、基数排序、桶排序
- 计数排序,基数排序,桶排序和快速排序算法时间对比
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 基数排序,计数排序,桶排序
- 【程序员笔试面试必会——排序②】Python实现 计数排序、基数排序
- 计数排序-基数排序
- 数据结构与算法——计数排序、桶排序、基数排序
- 线性排序----计数排序, 基数排序, 桶排序