В настоящее время я изучаю алгоритмы в одном из моих классов CS. Я пытаюсь написать код для быстрой сортировки - PullRequest
0 голосов
/ 02 марта 2020

Как видно из названия, я пытаюсь написать код для быстрой сортировки, но я пытаюсь сделать это в соответствии с псевдокодом, данным нам в лекции. Это не задание, потому что я просто пытаюсь понять это самостоятельно. Я нашел образец QuickSort онлайн, но он выглядит не так, как говорит наш psuedocode. Код QuickSort, который я нашел в Интернете, использует указатели, я не думаю, что указатели упоминаются в данном psuedocode. Другими словами, может ли кто-нибудь проверить, нахожусь ли я на правильном пути, и, возможно, указать, где я все испортил. Спасибо!

Мой код

#include <iostream>
using namespace std;

int Partition(int arr[], int p, int r)
{
   int x = arr[r];
   int i = p - 1;

   for (int j = p; j < r - 1; j++)
   {
      if (arr[j] <= x)
      {
         i = i + 1;
        swap(arr[i], arr[j]);
      }

      swap(arr[i + 1], arr[r]);
   }

   return i + 1;
}

void Quicksort(int arr[], int p, int r)
{
    if (p < r)
    {
        int k = Partition(arr, p, r);
        Quicksort(arr, p, k - 1);
        Quicksort(arr, k + 1, r);
    }
}

void print(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
}

int main()
{
    int arr[] = { 5, 3, 4, 9, 10 }; 
    int n = sizeof(arr) / sizeof(arr[0]);


    Quicksort(arr, 0, n);
    print(arr, n);
    //I get an error here "Stack around the variable 'arr' was corrupted"
}

Это psuedocode для моей функции QuickSort Изображение номер два - это заданный psuedocode для моей функции Partition

1 Ответ

1 голос
/ 02 марта 2020

В Partition (), если i никогда не увеличивается, то выполняется своп (arr [p-1], ...), вероятно причина ошибки стека. Обычно параметры быстрой сортировки - это первый и последний индексы, в отличие от первого и конечного (= последний + 1) индекса, в данном случае, быстрой сортировки (arr, 0, n-1). Внутренний l oop ищет значения

#include <iostream>
using namespace std;

int Partition(int arr[], int p, int r)
{
    int x = arr[r];
    int i = p;                          // fix
    for (int j = p; j < r; j++)         // fix
    {
        if (arr[j] < x)                 // fix
        {
            swap(arr[i], arr[j]);
            i = i + 1;                  // fix
        }
    }
    swap(arr[i], arr[r]);               // fix
    return i;                           // fix
}

void Quicksort(int arr[], int p, int r)
{
    if (p < r)
    {
        int k = Partition(arr, p, r);
        Quicksort(arr, p, k - 1);
        Quicksort(arr, k + 1, r);
    }
}

void print(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
}

int main()
{
    int arr[] = { 5, 3, 4, 9, 10 }; 
    int n = sizeof(arr) / sizeof(arr[0]);
    Quicksort(arr, 0, n-1);             // fix
    print(arr, n);
    return 0;                           // fix
}
...