Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

sem6_4

.c
Скачиваний:
0
Добавлен:
29.05.2019
Размер:
2.11 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#define SWAP(type, a, b) {type tmp = a; a = b; b=tmp;}
int num_digits(int a)
{
 int result = 0;
 while(a != 0)
 {
  result++;
  a /= 10;
 }
 return result;
}
int ten_pow(int a)
{
 int result = 1;
 for(int i = 0; i != a; ++i)
 {
  result *= 10;
 }
 return result;
}
void radix_sort(int* arr, int len)
{
 int max = arr[0];
 for(int i = 0; i != len; ++i)
 {
  if(arr[i] > max)
   max = arr[i];
 }
 int max_len = num_digits(max);
 int* arrays[10];
 int array_sizes[10];
 for(int i = 0; i != 10; ++i)
 {
  arrays[i] = (int*)malloc(sizeof(int) * len);
  array_sizes[i] = 0;
 }
 
 
 for(int i = 0; i != max_len; ++i)
 {
  for(int j = 0; j != len; ++j)
  {
   int digit = (arr[j] / ten_pow(i)) % 10;
   arrays[digit][array_sizes[digit]++] = arr[j];
  }
  int counter = 0;
  for(int j = 0; j != 10; ++j)
  { 
   for(int k = 0; k != array_sizes[j]; ++k)
   {
    arr[counter++] = arrays[j][k];
   }
   array_sizes[j] = 0;
  }

 }
 for(int i = 0; i != 10; ++i)
 {
  free(arrays[i]);
 }
}
int counting_sort(int* arr, int len)
{
 int max = arr[0];
 for(int i = 0; i != len; ++i)
 {
  if(arr[i] > max)
   max = arr[i];
 }
 int* counts = (int*)malloc((max + 1) * sizeof(int) );
 for(int i = 0; i != max; ++i)
 {
  counts[i] = 0;
 }
 for(int i = 0; i != len; ++i)
 {
  counts[arr[i]]++;
 }
 int* result = (int*)malloc(len * sizeof(int));
 int counter = 0;
 for(int i = 0; i <= max; ++i)
 {
  for(int j = 0; j != counts[i]; ++j)
   result[counter++] = i;
 }
 for(int i = 0; i != len; ++i)
 {
  arr[i] = result[i];
 }
 free(result);
}
int main()
{
 int* arr;
 int* arr2;
 int N;
 scanf("%d", &N);
 arr = (int*)malloc(sizeof(int) * N);
 arr2 = (int*)malloc(sizeof(int) * N);

 for(int i = 0; i != N; ++i)
 {
  arr[i] = rand() % 1000000;
  printf("%d ", arr[i]);
 }
 putchar('\n');
 radix_sort(arr, N);
 for(int q = 0; q != N; ++q)
  printf("%d ", arr[q]);
 putchar('\n');
 
 for(int i = 0; i != N; ++i)
 {
  arr2[i] = rand() % 255;
  printf("%d ", arr2[i]);
 }
 putchar('\n');
 counting_sort(arr2, N);
 for(int q = 0; q != N; ++q)
  printf("%d ", arr2[q]);
 putchar('\n');
 return 0;
}
Соседние файлы в предмете Информатика