Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. void counting_sort(int a[], int n) {
  2.     //TODO: write your stable counting sort here (only positive numbers)
  3.     int max;
  4.     max = find_max(a, n); // Максимальное число в массиве.
  5.     /* Ограничимся поиском только максимума, так как
  6.     ТЗ не требует работы для отрицательных чисел и смещения
  7.     для положительных чисел. Под смещением имеется ввиду рассмотрение
  8.     только тех чисел, которые есть в диапозоне массива.
  9.     */
  10.     int *b; // Массив результата
  11.     int *c; // Массив для подсчета
  12.     c = new int[max+1]; // c[i] - количество i в массиве a.
  13.     fill_zero(c, max+1);
  14.     for (int i = 0; i < n; i++) // Подсчет
  15.         c[a[i]]++;
  16.     for (int i = 1; i <= max; i++)
  17.         c[i]+=c[i-1];
  18.  
  19.     b = new int[n];
  20.     for (int i = n - 1; i >= 0; i--)
  21.     {
  22.         b[c[a[i]] - 1] = a [i];
  23.         c[a[i]]--;
  24.     }
  25.     memcpy(a, b, sizeof (int) *n); // заменяем исходный массив на результат
  26.     delete [] c;
  27.     delete [] b;// высвобождение памяти
  28. }
  29.  
  30. void radix_sort256(int a[], int n) {
  31.     //TODO: write your radix sort here (256 number system, only positive numbers)
  32.     union auxiliaryUnion
  33.     {
  34.         int num;
  35.         unsigned char uc[4];
  36.     };
  37.     int NUMBERS_IN_BYTE = 256; // 1 byte
  38.     auxiliaryUnion *aux, *b;
  39.     aux = new auxiliaryUnion[n]; // подаетеся на вход
  40.     b = new auxiliaryUnion[n]; // записываем ответ
  41.     for (int i = 0; i < n; i++) // Заполняем массив
  42.         aux[i].num = a[i];
  43.     int *c;
  44.     c = new int [NUMBERS_IN_BYTE]; // Массив для подсчета
  45.     for (int k = 0; k < 4; k++) // Сортировка 4 байтов, начиная с младшего
  46.     {
  47.         fill_zero(c, NUMBERS_IN_BYTE);
  48.         for (int i = 0; i < n; i++) // Подсчет
  49.             c[aux[i].uc[k]]++;
  50.         for (int i = 1; i < NUMBERS_IN_BYTE; i++)
  51.             c[i]+=c[i-1]; //Стойкость
  52.         for (int i = n - 1; i >= 0; i--)
  53.         {
  54.             b[c[aux[i].uc[k]] - 1].num = aux[i].num; // Заполнение ответа.
  55.             c[aux[i].uc[k]]--;
  56.         }
  57.         memcpy(aux, b, sizeof (int) * n);
  58.     }
  59.     memcpy(a, aux, sizeof (int) * n);
  60.     delete [] c;
  61.     delete [] aux;  
  62.     delete [] b; // Высвобождаем память
  63. }
  64.  
  65. int find_max (int a[], int n) { // Поиск максимума в массиве
  66.     int max = a[0];
  67.     for (int i = 1; i < n; i++)
  68.     {
  69.         if (a[i] > max)
  70.             max = a[i];
  71.     }
  72.     return max;
  73. }
  74.  
  75. void fill_zero (int a[], int n) { // Заполнение массива нулями
  76.     for (int i = 0; i < n; i++)
  77.         a[i] = 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement