Advertisement
Guest User

radix

a guest
Mar 28th, 2020
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int digit(char* number, int position) {
  5. return (int)(number[position] - '0');
  6. }
  7.  
  8. void sortByPosition(char** tab, int n, int pos) {
  9. int k = 10;
  10. int *counters = malloc(k*sizeof(int));
  11. char** result = malloc(n*sizeof(char*));
  12.  
  13. for(int i = 0; i < k; i++) {
  14. counters[i] = 0;
  15. }
  16. for(int i = 0; i < n; i++) {
  17. counters[digit(tab[i], pos)]++;
  18. }
  19. for(int i = 1; i < k; i++) {
  20. counters[i] += counters[i - 1];
  21. }
  22. for(int i = n - 1; i >= 0; i--) {
  23. result[counters[digit(tab[i], pos)] - 1] = tab[i];
  24. counters[digit(tab[i], pos)]--;
  25. }
  26. for(int i = 0; i < n; i++){
  27. tab[i] = result[i];
  28. }
  29. for(int j=0; j<n; j++){
  30. free(result[j]);
  31. }
  32.  
  33. for(int i=0; i<k; i++) {
  34. free(counters[i]);
  35. }
  36.  
  37. free(counters);
  38. free(result);
  39.  
  40.  
  41.  
  42. }
  43.  
  44. void radixSort(char** tab, int n, int length) {
  45. for(int i = length - 1; i >= 0; i--) {
  46. sortByPosition(tab, n, i);
  47. }
  48. }
  49.  
  50. int main() {
  51. int Z;
  52. scanf("%d", &Z);
  53.  
  54. while (Z--) {
  55.  
  56. int n, length;
  57. scanf("%d", &n);
  58. scanf("%d", &length);
  59. char **tab = malloc(n*sizeof(char*));
  60. for(int i=0; i<n; i++) {
  61. tab[i] = malloc((length+1)*sizeof(char));
  62. scanf("%s", tab[i]);
  63. }
  64.  
  65. radixSort(tab, n, length);
  66.  
  67. for(int i=0; i<n; i++) {
  68. printf("%s\n", tab[i]);
  69. free(tab[i]);
  70. }
  71. free(tab);
  72. }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement