Алгоритм наименьшего числа 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.

0 ответов

Другие вопросы по тегам