Advertisement
Rot256

Count Sort

Apr 21st, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void place_sort(int* v, int l) {
  6.     // Find min, max of array
  7.     int min, max;
  8.     for (int i = 0; i < l; i++) {
  9.         if (v[i] > max) {
  10.             max = v[i];
  11.         } else if (v[i] < min) {
  12.             min = v[i];
  13.         }
  14.     }
  15.  
  16.     // Construct array
  17.     int items = abs(max-min);
  18.     int* vals = (int*) calloc(items, sizeof(int));
  19.     if(vals == NULL) {
  20.         printf("Not enough memory!");
  21.         exit(-1);
  22.     }
  23.  
  24.     // Sort
  25.     for (int i = 0; i < l; i++) {
  26.         vals[v[i] - min]++;
  27.     }
  28.  
  29.     // Move back into array
  30.     int n = 0; // vals index (relative value of element)
  31.     for (int i = 0; i < l; i++) {
  32.         while(vals[n] <= 0) {
  33.             n++;
  34.         }
  35.         v[i] = n + min;
  36.         vals[n]--;
  37.     }
  38.  
  39.     // Free temperary array
  40.     free(vals);
  41. }
  42.  
  43. void print_array(int* v, int l) {
  44.     for (int i = 0; i < l; i++) printf("%8d\n", v[i]);
  45. }
  46.  
  47. int main(int argc, char* argv[]) {
  48.     if (argc != 3) {
  49.         printf("Usage:\n");
  50.         printf("%s 'Size of array' 'Maximum value'\n", argv[0]);
  51.         exit(0);
  52.     }
  53.  
  54.     int l = atoi(argv[1]);  // Size of array
  55.     int t = atoi(argv[2]);  // Modulo value for array
  56.     printf("Params: %d %d\n", l, t);
  57.  
  58.     // Create random array 
  59.     srand(time(NULL));
  60.     int* A = (int*) calloc(l, sizeof(int));
  61.     for (int i = 0; i < l; i++) A[i] = rand() % t;
  62.  
  63.     // Sort
  64.     place_sort(A, l);
  65.  
  66.     // Print array
  67.     print_array(A, l);
  68.  
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement