fork download
  1. #include <iostream>
  2. #include "locale.h"
  3. #include <stdio.h>
  4. using namespace std;
  5. int n, digit_amt = 0; //digit amount - количество разрядов
  6. int max_digit(int num)
  7. {
  8. int max = 0;
  9. while (num > 1)
  10. {
  11. num /= 10;
  12. max++;
  13. }
  14. return max;
  15. }
  16.  
  17. int digit_value(int num, int digit)
  18. {
  19. while (digit>1)
  20. {
  21. num /= 10;
  22. digit--;
  23. }
  24. return num % 10;
  25. }
  26.  
  27. void radix_sort(int **dop_mas, int *mas, int digit)
  28. {
  29. int *mas_col, i, j, temp = 0; //mas_col - в скольки числах есть определенная цифра (напр., mas_col[5] = 2 - в двух числах есть пятерка
  30.  
  31. mas_col = new int[10]; //Здесь падает
  32. for (i = 0; i<10; i++)
  33. mas_col[i] = 0;
  34. for (i = 0; i<n; i++)
  35. {
  36. int a = digit_value(mas[i], digit);
  37. dop_mas[mas_col[a]][a] = mas[i]; //mas_col заполняется неправильно
  38. mas_col[a]++;
  39. }
  40. for (i = 0; i<n; i++)
  41. {
  42. for (j = 0; j<mas_col[i]; j++)
  43. {
  44. mas[temp] = dop_mas[j][i];
  45. temp++;
  46. }
  47. }
  48. }
  49.  
  50. int main()
  51. {
  52. int digit, i, *mas, **dop_mas;
  53. cout << "Razmer massiva: " << endl;
  54. cin >> n;
  55. mas = new int[n];
  56. cout << "Elementy massiva: " << endl;
  57. for (i = 0; i<n; i++)
  58. {
  59. cout << "[" << i + 1 << "]= ";
  60. scanf("%x", &mas[i]);
  61. }
  62. dop_mas = new int*[n];
  63. for (i = 0; i<n; i++)
  64. dop_mas[i] = new int[n]; //Здесь скорее всего не n
  65. for (i = 0; i<n; i++)
  66. if (digit_amt < max_digit(mas[i]))
  67. digit_amt = max_digit(mas[i]); //3
  68. for (digit = 1; digit <= digit_amt; digit++) //
  69. radix_sort(dop_mas, mas, digit);
  70. for (i = 0; i<n; i++)
  71. cout << dec << mas[i] << endl;
  72. return 0;
  73. }
Success #stdin #stdout 0s 16056KB
stdin
4 4 2 3 5
stdout
Razmer massiva: 
Elementy massiva: 
[1]= [2]= [3]= [4]= 2
3
3
5