Моя задача реализовать Quicksort в одной функции с 2 параметрами (___ ____, int length). У меня есть фрагмент кода, в котором мне нужно реализовать быструю сортировку.
#include <cstdlib>
#include <iostream>
void qsort(___ ____, int length);
int main(int argc,char** argv){
int array[127];
for(int i = 0; i < 127; ++i)
{
array[i] = rand();
}
qsort(____, 127);
for(int i = 0; i < 127; ++i)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
return 0;
}
void qsort(___ ____, int right){
....
}
Мой подход к qsort:
void qsort( int *array, int right){
std::vector<int> less;
std::vector<int> equal;
std::vector<int> greater;
if (right <= 1){
return;
}
else
{
int mid = right/2;
int pivot = arr[mid];
for (int i = 0; i < 127; i++)
{
if (array[i] < pivot){
less.push_back(arr[i]);
}
if (array[i] == pivot){
equal.push_back(arr[i]);
}
if (array[i] > pivot){
greater.push_back(arr[i]);
}
}
int *less_a = less.data();
int *equal_a = equal.data();
int *greater_a = greater.data();
qsort(less_a, sizeof(less_a));
qsort(greater_a, sizeof(greater_a));
array = less_a + equal_a + greater_a;
}
}
Я знаю, что в нем есть несколько синтаксических ошибок, но «общая логика должна быть в порядке».
Моя первая проблема заключается в том, что qsort получает массив в качестве параметра, потому что, если я смотрю, какой элемент больше или меньше, чем точка поворота, я не могу использовать массивы, потому что я не знаю их размера. Итак, я подумал, что могу найти обходной путь с векторами, и в конце я конвертирую их в массивы обратно ...
Моя вторая проблема заключается в том, что qsort должен быть недействительным, поэтому я не знаю, как точно манипулировать массивом в конце ...
И, на мой взгляд, первым параметром qsort () должен быть массив. Конечная концепция тоже неверна, это просто «заполнитель» для действительной концепции.
Я рад любой помощи :) Я реализовал это решение на python, и оно отлично работает, я тоже могу загрузить его, если кто-то хочет его увидеть, но я не могу реализовать его на C++
Как мне сделать замену на месте?
раздел можно сделать на месте (вам просто нужны 2 группы, < и not <) (возможно, вам нужно скопировать pivot). Затем вы можете рекурсивно вызвать qsort для каждой части (вы должны запомнить каждый размер из раздела).





Быстрая сортировка - это манипуляция на месте. Означает, что вы будете изменять только исходный массив. Не нужно создавать лишние массивы. Это ответ на оба ваших вопроса.
Попробуйте этот код
void qsort(int* xArray, int xSize)
{
int lPivot = xArray[xSize-1];
int lIndexOfLargestElement = 0;
for (int i = 0; i < xSize-1; i++)
{
if (xArray[i] < lPivot)
{
// Swap largest element with this
int lTmp = xArray[i];
xArray[i] = xArray[lIndexOfLargestElement];
xArray[lIndexOfLargestElement] = lTmp;
lIndexOfLargestElement++;
}
}
// swap pivot with xArray[lIndexOfLargestElement]
int lTmp = xArray[lIndexOfLargestElement];
xArray[lIndexOfLargestElement] = xArray[xSize-1];
xArray[xSize-1] = lTmp;
if (lIndexOfLargestElement > 1)
qsort(xArray, lIndexOfLargestElement);
if (xSize-lIndexOfLargestElement-1 > 1)
qsort(xArray+lIndexOfLargestElement+1, xSize-lIndexOfLargestElement-1);
}
Объединять не обязательно, просто сделайте замену на месте.