поиск — реализация QuickSelect в C ++ без выделения дополнительной памяти

У меня есть небольшая домашняя помощь, если вы не возражаете. По сути, идея состоит в том, чтобы выполнить быстрый выбор массива значений, однако нам был предоставлен шаблон, и я не могу понять, как заставить функции работать с предоставленными данными.

Проблема в том, что значения не будут располагаться должным образом, или, если они это сделают, они будут меняться каждый раз, когда вводится одно и то же значение.

Вот функции, с которыми я работаю, я буду обозначать код, который я написал, через / ** / после кода, а любая другая строка является частью предоставленного мне шаблона.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>

using namespace std;

int partition(int *A, int len, int pivot_index)
{
int pivot_value = A[pivot_index]; /**/

int left = 0; /**/
int l = left; /**/
int right = len - 1; /**/
while(left < right)  /**/
{ /**/
while(A[left] < pivot_value) /**/
{ /**/
left++; /**/
} /**/

while(A[right] > pivot_value) /**/
{ /**/
right--; /**/
} /**/

if(A[left] < pivot_value) /**/
{ /**/
swap(A[left], A[right]); /**/
} /**/
} /**/

return left; /**/
}int select (int *A, int len, int rank)
{
if (len==1) return A[0];
int pivot_index = rand() % len;
int pivot_rank = partition(A, len, pivot_index);

if (rank == pivot_rank) return A[rank];
if (rank < pivot_rank) return select(A, pivot_rank, rank);
return select(A, len - pivot_rank, rank - pivot_rank ); /**/
}

int main(void)
{
int N, *A;

ifstream fin("test.txt");
fin >> N;
A = new int[N];
for (int i=0; i<N; i++) fin >> A[i];
fin.close();

int r;
cout << "Enter rank (0.." << N-1 << ")\n";
while (cin >> r) {
if (r < 0 || r >= N)
cout << "Invalid rank\n";
else
cout << "The element of rank " << r << " is " << select(A,N,r) << "\n";
}

delete[] A;
}

Мой файл «test.txt» содержит следующие значения:

10 -- this denotes the length of the array or how many values it will read in
7
14
12
2
25
18
15
13
100
63

Буду признателен за любую помощь в этом. Мой профессор не объяснил, как это будет работать вообще, и любые другие примеры, которые я нашел в Интернете, не отвечают на мой вопрос. Я провел много часов, пытаясь найти разные способы реализации этого, и на данный момент я просто понятия не имею.
Спасибо

РЕДАКТИРОВАТЬ: изменено, так что теперь можно напрямую реализовать и скомпилировать. Также добавлены библиотеки, которые я использую

0

Решение

Есть много проблем с вашим кодом.

while(A[left] < pivot_value) {  left++; }

Это не проверяет, что слева не проходит за конец массива.

while(A[right] > pivot_value) { right--;}

Это не проверяет, чтобы это право не запускалось до начала массива.

while(left < right)

Это бесконечный цикл когда

  1. оставил < право
  2. A [left]> = pivot_value
  3. A [право] <= pivot_value

select(A, len - pivot_rank, rank - pivot_rank );

Это не правильный раздел для продолжения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]