基数排序-----链表的应用

code:

/*
基数排序 思路:10个桶,按0-9排好序,首先计算各位数,末尾哪个数,就放到哪个桶去

         易错点:不能由高位向低位比较,只能有低位先比较,然后到高位(两个数相同,但是顺序是错的,导致由高位就会出现问题) 
         
         找出最大位数,然后根据最大位数就能决定要循环多少遍
		 
		         1.计数初始化,然后从个位开始,每次找到个位i,然后在cout[i]++,记住每个数
	             2.将每个count叠加,记录最多多少个数
				 3.从高位开始存储,放到相应辅助函数中,然后再更新data[]数据
		重复以上,最终得到的data[]就是我们拍好的值 
*/
#include <iostream>

using namespace std; 

int maxbit(int data[],int n)//辅助函数,求数据的最大位数
{
   int d=1;//保存最大的位数
   int p=10;
         for(int i=0;i<n;++i)
         {
            while(data[i]>=p)
            {
                  p*=10;
                   ++d;
            }
         }
       return d;
}
void radixsort(int data[],int n)//基数排序
{
           int d=maxbit(data,n);//最大位数 
           int* tmp=new int[n];
           int* count=new int[10];//计数器
           int i,j,k;
           int radix=1;
       for(i=1;i<=d;i++)//进行d次排序
       {
           for(j=0;j<10;j++)
              count[j]=0;//每次分配前清空计数器
           for(j=0;j<n;j++) //计算每位有多少个数 
           {
               k=(data[j]/radix)%10;//统计每个桶中的记录数
               count[k]++;
           }
            for(j=1;j<10;j++)
               count[j]=count[j-1]+count[j];//将tmp中的位置依次分配给每个桶
            for(j=n-1;j>=0;j--)//将所有桶中记录依次收集到tmp中
            {
                 k=(data[j]/radix)%10;
                 tmp[count[k]-1]=data[j];
                  count[k]--;
            }
         for(j=0;j<n;j++)//将临时数组的内容复制到data中
              data[j]=tmp[j];
          radix=radix*10;
       }
delete[]tmp;
delete[]count;
}

int main(){
	int s[]={1,4,56,61,72,1000,234,651,4};
	radixsort(s,9);
	for(int i= 0;i <9;i++)
	   cout <<s[i]<<" ";
    cout <<endl;
	return 0;
}

  

posted on 2014-11-24 23:24  lzm420241  阅读(149)  评论(1)    收藏  举报

导航