码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——基数排序(桶式排序)

时间:2015-04-04 09:18:12      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:c语言   排序算法   基数排序   桶式排序   

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。(引自百度百科)

简单的理解就是按权高低依次排序。比如说有64,8,216,512,27,729,0,1,343,125这10个数排序。我们可以看到最大的数是个三位数,最小的是个个位数。则按权高低排序即从第一趟个位数比较大小,从小到大排序为:

01 512 343 64 125 216 27 8 729

第二趟十位数比较大小,从小到大排序为:

01 8 512 216 125 27 729 343 64

第三趟百位数比较大小,从小到大排序为:

01 8 27 64 125216 343512 729

每趟排序按照基数位大小的不同分别放入相应基数的桶中:

假设有10个桶:

第一趟排序第二趟排序 第三趟排序

0:0 0,1,80,1,8,27,64

1:1 512,216125

2:512 125,27,729216

3:343 343

4:64 343

5:125 512

6:216 64

7:27 729

8:8

9:729

代码实现:

#include<stdio.h>
#include<math.h>

#define N 10

int FindMax(int *p,int n);//find max
int FindMaxRadix(int a);
void RadixSort(int *p,int m,int n);

int main()
{
    int num=0,i=0;
    int a[N]={64,8,2216,512,27,729,100,1,1343,125};
    num=FindMaxRadix(FindMax(a,N));
    RadixSort(a,num,N);
    for(i=0;i<N;i++)
        printf("%d\t",a[i]);

    return 0;
}

int FindMax(int *p,int n)
{
    int i=0,max;
    max=*p;
    for(i=0;i<n;i++)
    {
        if(*(p+i)>max)
            max=*(p+i);
    }
    return max;
}

int FindMaxRadix(int a)
{
    int temp=0,count=1;
    while(a!=0)
    {
        temp=a/10;
        count++;
        a=temp;
    }
    return count;
}

void RadixSort(int *p,int m,int n)//m是最大位数  n是数组大小
{
    int count=0;
    int i=0,radix=0,j,k;
    int temp=0;
    int bucket[10][10]={};
    for(i=0;i<m;i++)
    {
        radix=(int)pow(10,i);
        for(j=0;j<n;j++)
        {
            temp=(*(p+j)/radix)%10;
            for(k=0;k<10;k++)
            {
                if(bucket[temp][k]==0)
                {
                    bucket[temp][k]=*(p+j);
                    break;
                }
            }
        }

        //将桶中的数按排序后的倒回原数组中
        k=0;
        for(count=0;count<10;count++)
        {
            for(j=0;j<10;j++)
            {
                if(bucket[count][j]!=0)
                {
                    if(k==n)
                        break;
                    *(p+k)=bucket[count][j];
                    k++;
                    bucket[count][j]=0;
                }
            }
        }
    }
}

当然,桶式排序的优缺点也是显而易见的。

优点:效率高。

缺点:占用内存大,只能对正整数排序(采用二维数组做桶时)。



排序算法——基数排序(桶式排序)

标签:c语言   排序算法   基数排序   桶式排序   

原文地址:http://blog.csdn.net/u010275850/article/details/44859015

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!