【WEISS算法书】MSD基数排序

看到了基数排序。。

LSD还好理解和实现。。

MSD就稍微麻烦一点。。。

用到了递归。。。

不过学了汇编。。对递归也理解得更好了。。

继续继续。。

Code:
  1. #include "stdafx.h"   
  2. #include "stdio.h"    
  3.   
  4. void LSD(int data[],int digit)   
  5. {   
  6.     int temp[10][10] = {0};    
  7.     int order[10] = {0};    
  8.     int i, j, k, n, lsd;    
  9.     k = 0;    
  10.     n = 1;    
  11.     /*printf("/n排序前: ");   
  12.     for(i = 0; i < 10; i++)   
  13.         printf("%d ", data[i]);   
  14.     putchar('/n');   
  15.     */  
  16.     while(n <=digit) {    
  17.         for(i = 0; i < 10; i++) {    
  18.             lsd = ((data[i] / n) % 10);    
  19.             temp[lsd][order[lsd]] = data[i];    
  20.             order[lsd]++;    
  21.         }    
  22.         printf("/n重新排列: ");    
  23.         for(i = 0; i < 10; i++) {    
  24.             if(order[i] != 0)    
  25.                 for(j = 0; j < order[i]; j++) {    
  26.                     data[k] = temp[i][j];    
  27.                     printf("%d ", data[k]);    
  28.                     k++;    
  29.                 }    
  30.             order[i] = 0;    
  31.         }    
  32.         n *= 10;    
  33.         k = 0;    
  34.     }    
  35.   
  36.     putchar('/n');    
  37.     printf("/n排序后: ");    
  38.     for(i = 0; i < 10; i++)    
  39.         printf("%d ", data[i]);    
  40. }   
  41.   
  42. void MSD(int data[],int size,int digit)   
  43. {   
  44.     if(digit<1)   
  45.     {   
  46.         return;   
  47.     }   
  48.     if(size==0 || size==1)   
  49.     {   
  50.         return;   
  51.     }   
  52.     if(size==2)   
  53.     {   
  54.         if(data[1]<data[0])   
  55.         {   
  56.   
  57.             int temp=data[0];   
  58.             data[0]=data[1];   
  59.             data[1]=temp;   
  60.         }   
  61.         return;   
  62.     }   
  63.     int temp[10][10] = {0};    
  64.     int order[10] = {0};    
  65.     int n=digit;   
  66.     int msd,i,j,k;   
  67.   
  68.   
  69.     for(i = 0; i < size; i++)    
  70.     {    
  71.         msd = ((data[i] / n) % 10);    
  72.         temp[msd][order[msd]] = data[i];    
  73.         order[msd]++;    
  74.     }    
  75.   
  76.     for(i=0;i<10;i++)   
  77.     {   
  78.         MSD(temp[i],order[i],digit/10);   
  79.     }   
  80.        
  81.      k=0;   
  82.      for(i = 0; i < 10; i++) {    
  83.             if(order[i] != 0)   
  84.             {   
  85.                 for(j = 0; j < order[i]; j++) {    
  86.                     data[k] = temp[i][j];    
  87.                     k++;    
  88.                 }    
  89.             }   
  90.             order[i] = 0;    
  91.         }    
  92. }   
  93.   
  94. int data1[10] = {273, 822, 355, 358, 271, 716, 928, 365, 359, 272};    
  95. int main(void) {    
  96.        
  97.     MSD(data1,sizeof(data1)/sizeof(data1[0]),100);   
  98.     for(int i=0;i<sizeof(data1)/sizeof(data1[0]);i++)   
  99.     {   
  100.         printf("%d ",data1[i]);   
  101.     }   
  102.     return 0;    
  103. }   

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值