ошибка быстрой сортировки в c ++ с использованием классов

0

Я сделал программу в C++, используя классы и объекты для быстрого сортировки. Я собрал это в онлайн-компиляторах и обнаружил, что это тайм-аут, потому что этот код занимает слишком много времени и памяти.

Когда я позже скомпилировал его на Visual C++ 2010, он сказал unhandled exception: stack overflow Я пытаюсь вычислить бесконечный цикл, запущенный в функции члена класса void quick sort (a[],l,r). Пожалуйста, помогите.

#include <iostream>
using namespace std;

class sort;

int main()
{
    class sort
    {
    public:
        int split(int a[],int l,int r)
        {
            int i,j,p,t;
            p=a[l];
            i=(l+1);
            j=r;

            while (l<=r)
            {
                while ((a[i]<p)&&(i<j))
                    r--;

                while ((a[j]>p)&&(l<r))
                    l++;

                if (i<=j)
                {
                    t=a[i];
                    a[i]=a[j];
                    a[j]=t;
                }
            }
            t=p;
            p=a[j];
            a[j]=p;

            return j;
        }


        void quicksort(int a[],int l,int r)
        {
            int s;
            if (l<r)
            {
                s=split(a,l,r);
                quicksort(a,l,(s-1));
                quicksort(a,(s+1),l);
            }
        }

    } obj1;

    int a[30],n,i;

    cout<<"\nEnter no of elements :\t 5";
    n=5;

    cout<<"\nEnter elements :\n";
    a[0]=9;
    a[1]=6;
    a[2]=3;
    a[3]=5;
    a[4]=1;

    cout<<"\nElemets before sort :\n";
    for(i=0;i<n;i++)
        cout<<" "<<a[i];

    obj1.quicksort(a,0,(n-1));

    cout<<"\nElements after sort:\n";
    for (i=0;i<n;i++)
        cout<<" "<<a[i];

    return 0;
}
  • 2
    Запустите его в отладчике VC, и он укажет вам, где выдается исключение. Это должно помочь вам найти ошибку.
  • 1
    Запустите его в отладчике, исследуйте трассировку стека, как только переполнение стека произойдет
Показать ещё 2 комментария
Теги:
sorting

1 ответ

1

Здесь есть несколько проблем:

int split(int a[],int l,int r)
{
    int i,j,p,t;
    p=a[l];
    i=(l+1);
    j=r;

    // consider what will happen for an array with just 1 or 2 elements?
    while (l<=r) // should be while i<=j;
    {
        while ((a[i]<p)&&(i<j))
            r--; //should be j--

        while ((a[j]>p)&&(l<r))
            l++; // should be i++

        if (i<=j) // sadly this will only true when you've got an array with 1 element 
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    t=p;
    p=a[j];
    a[j]=p;

    return j;
}

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

0. make i = l+1 and j = r;

1. while true:

1.1 while a[i]<a[l] i++

1.2 while a[j]>a[l]  j--

1.3 break if i>= j;

1.4 exchange a[i] and a[j]

2. exchange a[l] and a[j]

Вы делаете разные вещи в своей реализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню