Поразрядная сортировка(C++)
Суть проблемы в том, что компилятор зависает на выделеной строке
#include <iostream>
#include <ctime>
using namespace std;
int FindMax(int A[], int n)
{
int max = A[0];
for (int i = 1; i < n; i++)
{
if (A[i] > max)
{
max = A[i];
}
}
return max;
}
int FindDigit(int n, int i)
{
int result = (n / pow(10, i - 1));
result %= 10;
return result;
}
int razryad(int n)
{
int N = n;
int x = 0;
for (; ; x++)
{
if (N < 1)
{
return x;
}
N /= 10;
}
}
void Radix_sort(int A[], int n)
{
int max = FindMax(A, n);
int razrad = razryad(max);
int* result = new int[n];
int* A1 = new int[n];
int score[2][10];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 10; j++)
{
score[i][j] = 0;
}
}
for (int cal = 1; cal <= razrad; cal++)
{
for (int i = 0; i < n; i++)
{
score[0][FindDigit(A[i], cal)]++;//считаем количество элементов в каждом разряде
}
for (int i = 0; i < 10; i++)
{
if (i == 0)
{
score[1][i] = 0;
}
else
{
score[1][i] = score[1][i - 1] + score[0][i - 1];//ищем стартовую позицию элемента
}
} //до этой части всё работает
for (int i = 0, a = 0; i < n; i++)
{
for (int j = 0; j < 10; j++)
{
for (; score[i][j] < score[1][j+1]; score[1][j]++)
{
for (int z = 0; z < n; z++)
{
if (A[z] < 0)
{
break;
}
if (FindDigit(A[z], cal) == j)
{
A1[a] = A[score[i][j]]; //на этой строке вылет
a++;
A[score[i][j]] = -1;
}
}
}
}
}
for (int i = 0; i < n; i++)
{
A[i] = A1[i];
}
}
}
int main()
{
srand(time(0));
int n;
cin >> n;
int *array = new int[n];
for (int i = 0; i < n; i++)
{
array[i] = rand() % 100;
cout << array[i] << "| ";
}
cout << endl;
Radix_sort(array, n);
for (int i = 0; i < n; i++)
{
cout << array[i] << "| ";
}
cout << endl;
}
Ответы (1 шт):
Автор решения: gitlng
→ Ссылка
Не смущает, что в int razryad(int n) благодаря for (; ; x++) цикл выполняется бесконечно? Компилятор при вызове этого цикла и крашится.