现在的位置: 首页 > 综合 > 正文

数据结构课程设计—-基数排序

2013年10月01日 ⁄ 综合 ⁄ 共 3793字 ⁄ 字号 评论关闭

一、基数排序的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。

二、最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
      最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

[cpp:firstline[0]]
view plaincopyprint?
  1. #include "stdio.h"
      
  2. #include "stdlib.h"
      
  3. int main(void)  
  4. {  
  5.     int data[10]={73,22,93,43,55,14,28,65,39,81};  
  6.     int temp[10][10]={0};  
  7.     int order[10]={0};  
  8.     int i,j,k,n,lsd;  
  9.     k=0;n=1;  
  10.     printf("排序前: ");  
  11.     for (i=0;i<10;i++)  
  12.         printf("%d ",data[i]);  
  13.     putchar('/n');  
  14.     while (n<=10)  
  15.     {  
  16.         for (i=0;i<10;i++)  
  17.         {  
  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.         {  
  25.             if(order[i]!=0)  
  26.                 for (j=0;j<order[i];j++)  
  27.                 {  
  28.                     data[k]=temp[i][j];  
  29.                     printf("%d ",data[k]);  
  30.                     k++;  
  31.                 }  
  32.                 order[i]=0;  
  33.         }  
  34.         n*=10;  
  35.         k=0;  
  36.     }  
  37.     printf("/n");  
  38.     printf("/n排序后: ");  
  39.     for(i=0;i<10;i++)  
  40.         printf("%d ",data[i]);  
  41.     printf("/n");  
  42.     system("pause");  
  43.     return 0;  
  44. }  

一、基数排序的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。

二、最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
      最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

[cpp:firstline[0]]
view plaincopyprint?
  1. #include "stdio.h"
      
  2. #include "stdlib.h"
      
  3. int main(void)  
  4. {  
  5.     int data[10]={73,22,93,43,55,14,28,65,39,81};  
  6.     int temp[10][10]={0};  
  7.     int order[10]={0};  
  8.     int i,j,k,n,lsd;  
  9.     k=0;n=1;  
  10.     printf("排序前: ");  
  11.     for (i=0;i<10;i++)  
  12.         printf("%d ",data[i]);  
  13.     putchar('/n');  
  14.     while (n<=10)  
  15.     {  
  16.         for (i=0;i<10;i++)  
  17.         {  
  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.         {  
  25.             if(order[i]!=0)  
  26.                 for (j=0;j<order[i];j++)  
  27.                 {  
  28.                     data[k]=temp[i][j];  
  29.                     printf("%d ",data[k]);  
  30.                     k++;  
  31.                 }  
  32.                 order[i]=0;  
  33.         }  
  34.         n*=10;  
  35.         k=0;  
  36.     }  
  37.     printf("/n");  
  38.     printf("/n排序后: ");  
  39.     for(i=0;i<10;i++)  
  40.         printf("%d ",data[i]);  
  41.     printf("/n");  
  42.     system("pause");  
  43.     return 0;  
  44. }  

抱歉!评论已关闭.