Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // dep stands for significant depth of words,
  6. // e.g. if def == 3, then "iiia" and "iiib" are treated as equal.
  7. // Occurence of a short word doesn't raise a bug, if enough trailing null-terminators
  8.  
  9. void ssort(unsigned char **str, int num, int dep)
  10. {
  11.     unsigned char **str_ = malloc(num * sizeof(char *));
  12.  
  13.     while (dep--) {
  14.         int cnt[0x100] = {};
  15.  
  16.         for (int i = 0; i < num; ++i) {
  17.             ++cnt[str[i][dep]];
  18.         }
  19.         for (int c = 1; c < 0x100; ++c) {
  20.             cnt[c] += cnt[c-1];
  21.         }
  22.         for (int i = num-1; i >= 0; --i) {
  23.             str_[--cnt[str[i][dep]]] = str[i];
  24.         }
  25.         memcpy(str, str_, num * sizeof(char *));
  26.     }
  27. }
  28.  
  29. int main(int argc, char **argv)
  30. {
  31.     ssort(argv+2, argc-2, atoi(argv[1]));
  32.     for (int i = 2; i < argc; ++i) puts(argv[i]);
  33. }
  34.  
  35. /*
  36.  
  37. $ ./testssort 1 suka blyad ne dala ebat
  38. blyad
  39. dala
  40. ebat
  41. ne
  42. suka
  43.  
  44. $ ./testssort 1 kbl kal
  45. kbl
  46. kal
  47.  
  48. $ ./testssort 2 kbl kal
  49. kal
  50. kbl
  51.  
  52. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement