• LSD Radix Sort,两个实现


    自己用单链表实现如下:

       1:  #include <stdio.h>
       2:  #include <stdlib.h>
       3:  #include <math.h>
       4:   
       5:  /*Radix Sort*/
       6:  #define MAX_COUNT 100
       7:  #define BASE 10
       8:  typedef struct node snode;
       9:  typedef struct node* ptrtonode;
      10:  struct node
      11:  {
      12:      int value;
      13:      ptrtonode next;
      14:  };
      15:  ptrtonode create_newnode();
      16:  void make_empty(ptrtonode pnode);
      17:  void append_node(ptrtonode header,ptrtonode element);
      18:  void append_value(ptrtonode header,int value);
      19:  void print(int *array,int length);
      20:  void print_list(ptrtonode header);
      21:  void clear_list(ptrtonode header);
      22:   
      23:  ptrtonode create_newnode()
      24:  {
      25:      ptrtonode pnode=(ptrtonode)malloc(sizeof(snode));
      26:      make_empty(pnode);
      27:      return pnode;
      28:  }
      29:   
      30:  void make_empty(ptrtonode pnode)
      31:  {
      32:      pnode->value=0;
      33:      pnode->next=NULL;
      34:  }
      35:   
      36:  void append_node(ptrtonode header,ptrtonode element)
      37:  {
      38:      ptrtonode position=header;
      39:      while(position->next!=NULL)
      40:      {
      41:          position=position->next;
      42:      }
      43:      position->next=element;
      44:  }
      45:   
      46:  void append_value(ptrtonode header,int value)
      47:  {
      48:      ptrtonode element=create_newnode();
      49:      element->value=value;
      50:      element->next=NULL;
      51:      append_node(header,element);
      52:  }
      53:   
      54:  void print(int *array,int length)
      55:  {
      56:      int i=0;
      57:      for(i=0;i<length;i++)
      58:      {
      59:          printf("%d,",array[i]);
      60:      }
      61:      printf("\n");
      62:  }
      63:   
      64:  void print_list(ptrtonode header)
      65:  {
      66:      ptrtonode position=header->next;
      67:      while(position!=NULL)
      68:      {
      69:          printf("%d,",position->value);
      70:          position=position->next;
      71:      }
      72:      printf("\n");
      73:  }
      74:   
      75:  void clear_list(ptrtonode header)
      76:  {
      77:      ptrtonode position=header->next;
      78:      ptrtonode temp;
      79:      while(position!=NULL)
      80:      {
      81:          temp=position->next;
      82:          free(position);
      83:          position=temp;
      84:      }
      85:      header->next=NULL;
      86:  }
      87:   
      88:  int main()
      89:  {
      90:      int numbers[MAX_COUNT];
      91:      int results[MAX_COUNT];
      92:      int i=0;
      93:      int maxValue=0;
      94:      //init random numbers to sort
      95:      for(i=0;i<MAX_COUNT;i++)
      96:      {
      97:          numbers[i]=rand();
      98:          results[i]=numbers[i];
      99:          if(numbers[i]>maxValue)
     100:          {
     101:              maxValue=numbers[i];
     102:          }
     103:      }
     104:      printf("the random numbers:\n");
     105:      print(numbers,MAX_COUNT);
     106:   
     107:      //get the digit
     108:      i=maxValue;
     109:      int digit=0;
     110:      while(i!=0)
     111:      {
     112:          i=i/BASE;
     113:          digit++;
     114:      }
     115:      printf("the digit is %d\n",digit);
     116:   
     117:      //init bucket
     118:      ptrtonode buckets[BASE];
     119:      for(i=0;i<BASE;i++)
     120:      {
     121:          buckets[i]=create_newnode();
     122:      }
     123:   
     124:      int j,k,m,digitValue;
     125:      for(j=0;j<digit;j++)
     126:      {
     127:          if(j==0)
     128:          {
     129:              k=1;
     130:          }
     131:          else
     132:          {
     133:              k*=10;
     134:          }
     135:   
     136:          for(i=0;i<MAX_COUNT;i++)
     137:          {
     138:              digitValue=(results[i]/k)%BASE;
     139:              append_value(buckets[digitValue],results[i]);
     140:          }
     141:          m=0;
     142:          for(i=0;i<BASE;i++)
     143:          {
     144:              ptrtonode position=buckets[i];
     145:              position=position->next;
     146:              while(position!=NULL)
     147:              {
     148:                  results[m]=position->value;
     149:                  position=position->next;
     150:                  m++;
     151:              }
     152:          }
     153:   
     154:          for(i=0;i<BASE;i++)
     155:          {
     156:              clear_list(buckets[i]);
     157:          }
     158:      }
     159:   
     160:      print(results,MAX_COUNT);
     161:      return 0;
     162:  }

    我们也可以纯数组实现,

    这里给出的是wiki(http://en.wikipedia.org/wiki/Radix_sort)给出的用数组实现的版本:

       1:  #include <stdio.h>
       2:  #define MAX 5
       3:  #define SHOWPASS
       4:  void print(int *a, int n)
       5:  {
       6:    int i;
       7:    for (i = 0; i < n; i++)
       8:      printf("%d\t", a[i]);
       9:  }
      10:   
      11:  void radixsort(int *a, int n)
      12:  {
      13:    int i, b[MAX], m = 0, exp = 1;
      14:    for (i = 0; i < n; i++)
      15:    {
      16:      if (a[i] > m)
      17:        m = a[i];
      18:    }
      19:   
      20:    while (m / exp > 0)
      21:    {
      22:      int bucket[10] =
      23:      {
      24:        0
      25:      };
      26:      for (i = 0; i < n; i++)
      27:        bucket[a[i] / exp % 10]++;
      28:      for (i = 1; i < 10; i++)
      29:        bucket[i] += bucket[i - 1];
      30:      //Arrived here, the bucket array will store the index position of each element
      31:      for (i = n - 1; i >= 0; i--)
      32:        b[--bucket[a[i] / exp % 10]] = a[i];
      33:      for (i = 0; i < n; i++)
      34:        a[i] = b[i];
      35:      exp *= 10;
      36:   
      37:      #ifdef SHOWPASS
      38:        printf("\nPASS   : ");
      39:        print(a, n);
      40:      #endif
      41:    }
      42:  }
      43:   
      44:   
      45:  int main()
      46:  {
      47:    int arr[MAX];
      48:    int i, n;
      49:   
      50:   
      51:      n=5;
      52:    printf("Enter %d Elements : ", n);
      53:    for (i = 0; i < n; i++)
      54:      arr[i]=rand();
      55:   
      56:   
      57:    printf("\nARRAY  : ");
      58:    print(&arr[0], n);
      59:   
      60:    radixsort(&arr[0], n);
      61:   
      62:    printf("\nSORTED : ");
      63:    print(&arr[0], n);
      64:    printf("\n");
      65:   
      66:    return 0;
      67:  }

    显然算法二在性能上优于我自己实现的前一个,当然我实现的主要目的是为了学习单链表结构。

    不论是哪一种实现,其核心思想是不变的,这在算法导论中定义的再精辟再清楚不过了:

    RADIX_SORT(A,d)

    1. for i=1 to d

    2.       do use a stable sort to sort array A on digit i.

  • 相关阅读:
    Luogu P4727 [HNOI2009]图的同构记数
    ARC 101 E
    JSOI2019 Round2 游记
    JSOI2019 Round1(十二省联考)游记
    Technocup 2019
    Codeforces Round #533 (Div. 2)比赛总结
    学习链接
    2018.12.29-2018.1.9安师大附中集训
    关于考试
    NOIP2018提高组 游记
  • 原文地址:https://www.cnblogs.com/dancewithautomation/p/2607946.html
Copyright © 2020-2023  润新知