Cod sursa(job #2633976)

Utilizator RaduQQTCucuta Radu RaduQQT Data 9 iulie 2020 14:37:56
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h>



int n;

int getMax(int arr[])
{
    int mx = arr[0];
    for (int i = 1; i < n; i++)
        if (arr[i] > mx)
            mx = arr[i];
    return mx;
}

void countSort(int arr[], int exp)
{
    int *output=(int*)malloc((n+2)*sizeof(int));
    int i, count[10] = { 0 };


    for (i = 0; i < n; i++)
        count[(arr[i] / exp) % 10]++;

  
    for (i = 1; i < 10; i++)
        count[i] += count[i - 1];

 
    for (i = n - 1; i >= 0; i--)
    {
        output[count[(arr[i] / exp) % 10] - 1] = arr[i];
        count[(arr[i] / exp) % 10]--;
    }


    for (i = 0; i < n; i++)
        arr[i] = output[i];
}

void radixsort(int arr[])
{
 
    int m = getMax(arr);

  
    for (int exp = 1; m / exp > 0; exp *= 10)
        countSort(arr, exp);
}

void print(int arr[])
{
    for (int i = 0; i < n; i += 10)
        printf("%d ", arr[i]);
}

int main()
{
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out", "w", stdout);
    int a, b, c;
    scanf("%d%d%d%d", &n, &a, &b, &c);
    int* arr=(int*)malloc((n+10)*sizeof(int));

    arr[0] = b;
    for (int i = 1; i < n; i++)
    {
        arr[i] = ((a*arr[i - 1]) % c + b) % c;
    }

    radixsort(arr);
    print(arr);
}