经典排序算法之实现(七)

来源:互联网 发布:同步带选型软件 编辑:程序博客网 时间:2024/06/05 20:53

八、基数排序

1、基本思想

     将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

2、实例



3、程序代码

#include <iostream>using namespace std;int len;int *a;void baseSort(int a[], int len);int getSpecialData(int data, int length, int wei);int getMaxDataLen(int a[], int len);void main(){cout<<"请输入要排序的数列的长度:";cin>>len;cout<<"请输入具体的数字序列(以正数为例):";a = new int[len];for(int i = 0; i < len; i++){cin>>a[i];}baseSort(a, len);for(int j=0; j<len; j++){cout<<a[j]<<"   ";}cout<<endl;delete []a;}void baseSort(int a[], int len){int *b = new int[len*10],indexB=0;for(int k=0; k<len*10; k++){b[k] = -1;}int maxLen = getMaxDataLen(a,len);for(int i=1; i<=maxLen; i++){for(int j=0; j<len; j++){int base = getSpecialData(a[j], maxLen, i);switch(base){case 0:b[indexB]=a[j];indexB=indexB+10;break;case 1:b[indexB+1]=a[j];indexB=indexB+10;break;case 2:b[indexB+2]=a[j];indexB=indexB+10;break;case 3:b[indexB+3]=a[j];indexB=indexB+10;break;case 4:b[indexB+4]=a[j];indexB=indexB+10;break;case 5:b[indexB+5]=a[j];indexB=indexB+10;break;case 6:b[indexB+6]=a[j];indexB=indexB+10;break;case 7:b[indexB+7]=a[j];indexB=indexB+10;break;case 8:b[indexB+8]=a[j];indexB=indexB+10;break;case 9:b[indexB+9]=a[j];indexB=indexB+10;break;default:cout<<"数据错误!"<<endl;break;}}indexB =0;for(int k=0; k<10; k++){for(int w=0; w<len; w++){if(b[w*10+k] != -1){a[indexB] = b[w*10+k];b[w*10+k] = -1;indexB++;}if(indexB==10)break;}if(indexB==10)break;}indexB = 0;}delete []b;}int getSpecialData(int data, int length, int wei){int base=1;for(int i=wei; i>0; i--)base=base*10;data = data%base;base = base/10;data = data/base;return data;}int getMaxDataLen(int a[], int len){int max,maxLen=0;if(len==0){return 0;}max = a[0];for(int i=1; i<len; i++){if(max<a[i]){max = a[i];}}while(max>0){maxLen++;max =max/10;}return maxLen;}