Advertisement
Guest User

radixsort

a guest
Feb 20th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.01 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. union Int32** dissort(int *count, int n, int a, int (*q)(int i), union Int32* (*p)(int i)) {
  5.   int i = 0;
  6.   while(i <= a) {
  7.     count[i] = 0;
  8.     i++;
  9.   }
  10.   i = 0;
  11.   while (i < n) {
  12.     count[(*q)(i)]++;
  13.     i++;
  14.   }
  15.   i = 0;
  16.   while (i < a) {
  17.     count[i + 1] += count[i];
  18.     i++;
  19.   }
  20.   union Int32 **d;
  21.   d = (union Int32**)malloc(n * sizeof(union Int32*));
  22.   int j = n - 1;
  23.   while (j >= 0) {
  24.     int k = (*q)(j);
  25.     i = --count[k];
  26.     d[i] = (*p)(j);
  27.     j--;
  28.   }
  29.   return d;
  30. }
  31.  
  32. union Int32 {
  33.     int x;
  34.     unsigned char bytes[4];
  35. };
  36. union Int32 **a;
  37. int b0(int i) {
  38.   return a[i]->bytes[0];
  39. }
  40. int b1(int i) {
  41.   return a[i]->bytes[1];
  42. }
  43. int b2(int i) {
  44.   return a[i]->bytes[2];
  45. }
  46. int b3(int i) {
  47.   return a[i]->bytes[3] ^ (1 << 7);
  48. }
  49. union Int32* p(int i) {
  50.   return a[i];
  51. }
  52.  
  53. int main() {
  54.     int n, *countb0, *countb1, *countb2, *countb3;
  55.         countb0 = (int*)malloc(256 * sizeof(int));
  56.         countb1 = (int*)malloc(256 * sizeof(int));
  57.         countb2 = (int*)malloc(256 * sizeof(int));
  58.         countb3 = (int*)malloc(256 * sizeof(int));
  59.     scanf("%d", &n);
  60.     a = malloc(n * sizeof(union Int32*));
  61.     for (int i = 0; i < n; i++) {
  62.         a[i] = malloc(sizeof(union Int32));
  63.         scanf("%d", &a[i]->x);
  64.     }
  65.     union Int32** db0 = dissort(countb0, n, 255, *b0, *p);
  66.     free(a);
  67.     free(countb0);
  68.     a = db0;
  69.     union Int32** db1 = dissort(countb1, n, 255, *b1, *p);
  70.         free(a);
  71.         free(countb1);
  72.     a = db1;
  73.         union Int32** db2 = dissort(countb2, n, 255, *b2, *p);
  74.         free(a);
  75.         free(countb2);
  76.     a = db2;
  77.     union Int32** db3 = dissort(countb3, n, 255, *b3, *p);
  78.         free(a);
  79.         free(countb3);
  80.     a = db3;
  81.  
  82.     for (int i = 0; i < n; i++) {
  83.         printf("%d ", a[i]->x);
  84.         free(a[i]);
  85.     }
  86.         free(a);
  87.         return 0;
  88. }
  89.  
  90. ____________________________________________________________________________________________________________________________
  91.  
  92. Поразрядная сортировка целых чисел
  93.  
  94. Составьте программу radixsort.c, осуществляющую сортировку последовательности 32-разрядных целых чисел по возрастанию. В программе должен быть реализован алгоритм поразрядной сортировки.
  95. Программа должна считывать из стандартного потока ввода размер и элементы последовательности, и записывать в стандартный поток вывода элементы отсортированной последовательности.
  96. Например, если на вход программы подано
  97.  
  98. 5
  99. 1000 700 -5000 2038 0
  100.  
  101. то программа должна выводить в стандартный поток вывода
  102.  
  103. -5000 0 700 1000 2038
  104.  
  105. В программе сортируемая последовательность должна быть представлена в виде массива объединений Int32:
  106. union Int32 {
  107.     int x;
  108.     unsigned char bytes[4];
  109. };
  110. Тем самым подразумевается, что целые числа представлены в системе счисления по основанию 256. Доступ к отдельным байтам целого числа должен осуществляться через поле bytes объединения.
  111.  
  112. Замечание.
  113. Следует помнить, что байты, из которых состоит целое число, расположены в памяти в обратном порядке (little-endian). Кроме того, числа представлены в дополнительном коде, поэтому сортировка по старшему байту, в котором находится знаковый бит, оличается от сортировки по другим разрядам числа.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement