加文

在这个世界上取得成就的人,都努力去寻找他们想要的机会,如果找不到机会,他们便自己创造机会。 -- 萧伯纳
随笔 - 14, 文章 - 56, 评论 - 1, 引用 - 0
数据加载中……

基数排序LSD算法

#include <stdio.h>
#include 
<string.h>
/* 获取输入数字的索引值,dec指定数字的位数,3代表百位数,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int dec, int order)
{
    
int i, j, n;
    
int index;
    
int div;
    
/* 根据位数,循环减去不需要的高位数字 */
    
for (i=dec; i>order; i--
    {
        n 
= 1;
        
for (j=0; j<dec-1; j++)
            n 
*= 10;
        div 
= num/n;
        num 
-= div * n;
        dec
--;
    }
    
/* 获得对应位数的整数 */
    n 
= 1;
    
for (i=0; i<order-1; i++)
        n 
*= 10;
    
/* 获取index */
    index 
= num / n;
    
return index;
}
/* 进行基数排序 */
void radix_sort(int array[], int len, int dec, int order)
{
    
int i, j;
    
int index;     /* 排序索引 */
    
int tmp[100];  /* 临时数组,用来保存待排序的中间结果 */
    
int num[10];   /* 保存索引值的数组 */
    memset(num, 
010*sizeof(int));  /* 数组初始清零 */
    memset(tmp, 
0, len*sizeof(int)); /* 数组初始清零 */
    
if (dec < order) /* 最高位排序完成后返回 */
        
return;
    
for (i=0; i<len; i++) {
        index 
= get_index(array[i], dec, order);  /* 获取索引值 */
        num[index]
++;  /* 对应位加一 */
    }
    
for (i=1; i<10; i++)
        num[i] 
+= num[i-1]; /* 调整索引数组 */
    
for (i=len-1; i>=0; i--) {
        index 
= get_index(array[i], dec, order);  /* 从数组尾开始依次获得各个数字的索引 */
    j 
= --num[index];  /* 根据索引计算该数字在按位排序之后在数组中的位置 */
    tmp[j] 
= array[i]; /* 数字放入临时数组 */
    }
    
for (i=0; i<len; i++)
        array[i] 
= tmp[i];  /* 从临时数组复制到原数组 */
    
/* 继续按高一位的数字大小进行排序 */
    radix_sort(array, len, dec, order
+1);
}
int main(int argc, char *argv[])

{
    
int i;
    
int a[11= {101,258976515337359701916494303175};
    radix_sort(a, 
1133);
    
for (i=0; i<11; i++)
        printf(
"%d  ", a[i]);
    printf(
"\n");
    getchar();
    
return 0;
}

posted on 2011-10-25 15:32 chxzwj 阅读(803) 评论(0)  编辑 收藏 引用 所属分类: 常用算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理