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, unsigned 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. unsigned int *mas;
  53. int digit, i, **dop_mas;
  54. cout << "Razmer massiva: " << endl;
  55. cin >> n;
  56. mas = new unsigned int[n];
  57. cout << "Elementy massiva: " << endl;
  58. for (i = 0; i<n; i++)
  59. {
  60. cout << "[" << i + 1 << "]= ";
  61. scanf("%x", &mas[i]);
  62. }
  63. dop_mas = new int*[n];
  64. for (i = 0; i<n; i++)
  65. dop_mas[i] = new int[n]; //Здесь скорее всего не n
  66. for (i = 0; i<n; i++)
  67. if (digit_amt < max_digit(mas[i]))
  68. digit_amt = max_digit(mas[i]); //3
  69. for (digit = 1; digit <= digit_amt; digit++) //
  70. radix_sort(dop_mas, mas, digit);
  71. for (i = 0; i<n; i++)
  72. cout << dec << mas[i] << endl;
  73. return 0;
  74. }
Success #stdin #stdout 0s 15232KB
stdin
4 4 2 3 5
stdout
Razmer massiva: 
Elementy massiva: 
[1]= [2]= [3]= [4]= 2
3
3
5