Алгоритм наименьшего числа K, сбой при большом n
Поэтому у меня есть проект, в котором я должен использовать метод разбиения рекурсии и быстрой сортировки, чтобы найти k-й наименьший элемент в массиве. Когда для n = 1000 и k равно где-то от 500 до 1000, моя программа падает, и я не могу понять, почему. Вот как я называю метод:
int b[1000];
SelectKth4(500, b, 0, 999);
Этот алгоритм сначала делит массив на группы по 5, сортирует каждую группу, берет медиану каждой группы и сортирует медианы. Затем он принимает медиану медиан и использует ее как опору для метода разбиения. Поскольку точка поворота находится на своем месте, мы знаем, следует ли изгибать все вправо или влево от точки поворота. Вот как выглядит алгоритм:
int SelectKth4(int k , int* array, int beg, int end){
int size = end + 1 - beg;
if(size <= 5){
MergeSort(array, 0, size-1);
return array[k-1];
}
else{
int z = 0;
int numOfA = size/5;
int matrix[numOfA][5];
for(int i = 0; i < numOfA; i++){
for (int j = 0; j < 5; j++){
matrix[i][j] = array[z];
z++;
}
}
for(int i = 0; i < numOfA; i++){
MergeSort(matrix[i], 0, 4);
}
//medians
int medians[numOfA];
for (int i = 0; i < numOfA; i++){
medians[i] = matrix[i][2];
}
MergeSort(medians, 0, numOfA-1);
z = 0;
int pivPos;
int piv = medians[numOfA/2];
for (int i = 0; i < size; i++){
if (array[i] == piv){
pivPos = z;
break;
}
z++;
}
int test = partition(array, beg, end, pivPos);
if(k-1 == test){
return array[k-1];
}
else if (k-1 < test){
return SelectKth4(k, array, beg, test-1);
}
else
return SelectKth4(k, array, test+1, end);
Программа не падает, когда N составляет около 500 или менее (любое число для k работает), и программа не падает, когда N = 1000 и k находится в диапазоне от 0 до 499.