排序算法之基数排序
2012-12-21 21:43
204 查看
基数排序,利用计数排序思想,对数据分别按位数进行计数排序,时间复杂度O(n·k); 需要 O(n) 额外空间,是稳定的排序
#include<iostream> using namespace std; void RadixCountSort(int A[], int k, int len)//分别为需排序的数组,排序的基数,数组的长度 { int *C = new int[k]();//计数排序所需临时空间,初始化为0 int *nDataRadix = new int[len];//储存基数 int *ntempRadix = new int[len]; //储存每次排序后的数组(计数排序使用) int i,RadixBase=1,IsOk; while(true) { IsOk = 1;//排序完成标志位置1 for(i=0;i<k;i++)//对计数排序的临时空间清0 C[i]=0; for(i=0;i<len;i++)//将当前基数存入nDataRadix数组 { if(IsOk!=0&&A[i]/RadixBase!=0)//当不是所有数据都已判断完成时,标志位置0,当标志位已被置0时不再判断 IsOk=0; nDataRadix[i]=A[i]/RadixBase%10; } if(IsOk)//标志位为1则退出循环 break; /*对基数进行计数排序,或其他稳定排序*/ for(i=0;i<len;i++) ++C[nDataRadix[i]]; for(i=1;i<k;i++) C[i]+=C[i-1]; for(i=len-1;i>=0;i--) { --C[nDataRadix[i]]; ntempRadix[C[nDataRadix[i]]]=A[i]; } for(i=0;i<len;i++)//将按当前基数排好的顺序返回 { A[i]=ntempRadix[i]; } RadixBase*=k;//基数移至下一位 } delete []C; delete []nDataRadix; delete []ntempRadix; } int main() { int nData[10] = {123,5264,9513,854,9639,1985,159,3654,8521,8888}; RadixCountSort(nData,10,10); for (int i = 0; i < 10; ++i) { cout<<nData[i]<<"--"; } cout<<endl; system("pause"); return 0; }
相关文章推荐
- 经典排序算法 - 基数排序Radix sort
- 排序算法java 二 --基数排序、归并排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 经典排序算法 - 基数排序Radix sort
- 排序算法: 基数排序
- 经典排序算法 - 基数排序Radix sort
- 排序之表排序、基数排序及所有排序算法比较
- 经典排序算法 - 基数排序Radix sort
- 程序员必须掌握的8种排序算法(八):基数排序
- 排序算法之基数排序
- 经典排序算法 - 基数排序Radix sort
- 基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 排序算法之基数排序
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 排序算法 基数排序
- 排序算法系列:基数排序
- 排序算法(计数排序,基数排序,桶排序)
- 排序算法之基数排序
- 八大排序算法之基数排序