Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2012, 13:07   #1
mmd12
Новичок
Джуниор
 
Регистрация: 17.05.2012
Сообщений: 5
По умолчанию Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++)

реализовал два алгоритма на C++, алгоритм сортировки пирамидальный(кучей) и быстрой сортировки, все они сортируют массив в любом случае, но иногда например ввожу последовательность 2 1 3 45 12 5 23 6 4 89 2 он ее сортирует так: 0 1 2 2 3 4 5 12 23 45 и все и не дописывает в конце последний элемент, если на выходи когда массив уже отсортирован в цикле когда его отображаю, число итераций увеличить на единицу т е итераций больше чем размер массива, то тогда все получается и он дописывает недостающий символ в конце, но нуль остается в самом начале. вопрос, почему появляется нуль и как от него избавиться? спасибо

тут мне отписались что у них этот же код работает нормально типа другой компилялтор, я пишу на Qt и на VisualStudio

вот коды:

быстрая сортировка:

Код:
#include <iostream>
using namespace std;
 
void qicksort(int *a, int p, int r);
int partition(int *a, int p, int r);
 
int main(int argc, char *argv[])
{
 
    int *a;
    int size;
 
    cin >> size;
 
    a=new int (size);
 
    for(int i=0; i<size; i++)
    {
        cin >> a[i];
    }
 
    qicksort(a,0,size);
 
    for(int i=0; i<size; i++)
    {
        cout << a[i] << " ";
    }
 
    return 0;
}
 
void qicksort(int *a, int p, int r)
{
 
    int q;
 
    if(p<r)
    {
        q=partition(a,p,r);
        qicksort(a,p,q-1);
        qicksort(a,q+1,r);
    }
 
}
 
int partition(int *a, int p, int r)
{
 
    int t,k,x,i;
 
    x=a[r];
    i=p-1;
 
    for(int j=p; j<=(r-1); j++)
    {
        if(a[j]<=x)
        {
            i++;
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
 
    k=a[i+1];
    a[i+1]=a[r];
    a[r]=k;
 
    return (i+1);
 
}
сортировка кучей или пирамидальная:

Код:
#include <iostream>
using namespace std;
 
void max_heapify(int *a, int i, int size);
void build_max_heap(int *a, int i, int size);
void heapsort(int *a, int i, int size);
int parent(int i);
int left(int i);
int right(int i);
 
int main(int argc, char *argv[])
{
    int *a;
    int size,i;
 
    cin >> size;
 
    i=0;
 
    a=new int(size);
 
    for(int i=0; i<size; i++)
    {
        cin >> a[i];
    }
 
    heapsort(a,i,size);
 
    for(i=0; i<size; i++)
    {
        cout << a[i] << " ";
    }
 
    delete [] a;
 
    return 0;
}
 
int parent(int i)
{
    return (i/2);
}
 
int left(int i)
{
    return (2*i);
}
 
int right(int i)
{
    return ((2*i)+1);
}
 
void max_heapify(int *a, int i, int size)
{
    int l,r;
    int largest;
    int t=0;
 
    l=left(i);
    r=right(i);
 
    if((l<=size) && (a[l]>a[i]))
    {
        largest=l;
    }
    else
    {
        largest=i;
    }
 
    if((r<=size) && (a[r]>a[largest]))
    {
        largest=r;
    }
 
    if(largest!=i)
    {
        t=a[i];
        a[i]=a[largest];
        a[largest]=t;
        max_heapify(a,largest,size);
    }
}
 
void build_max_heap(int *a, int i, int size)
{
    i=size;
 
    for(int i=(size/2); i>=0; i--)
    {
        max_heapify(a,i,size);
    }
}
 
void heapsort(int *a, int i, int size)
{
    int t=0;
 
    build_max_heap(a,i,size);
 
    for(int i=size; i>=1; i--)
    {
        t=a[0];
        a[0]=a[i];
        a[i]=t;
        size=size-1;
        max_heapify(a,0,size);
    }
}


___________
1) Название темы должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В дальнейшем темы с подобным названием будут закрываться/удаляться,
а автор такой темы получать штрафы.

2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)

3) Кросспостинг (создание одинаковых тем и сообщений) запрещён правилами форума!


Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 17.05.2012 в 13:33.
mmd12 вне форума Ответить с цитированием
Старый 17.05.2012, 13:52   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Попробую предположить, что где-то здесь
i
Код:
nt partition(int *a, int p, int r)
{
 
    int t,k,x,i;
 
    x=a[r];
    i=p-1;                 //i=-1
 
    for(int j=p; j<=(r-1); j++)
    {
        if(a[j]<=x)
        {
            i++;           //j=0 i=0;...j=4 i=4
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
 
    k=a[i+1];      //i+1 =5 вышли за предел массива
    a[i+1]=a[r];
    a[r]=k;
 
    return (i+1);
 
}
и здесь тоже
Код:
void heapsort(int *a, int i, int size)
{
    int t=0;
 
    build_max_heap(a,i,size);
 
    for(int i=size; i>=1; i--) //i=size, наверное i=size-1, т.к выходим за массив
    {
        t=a[0];
        a[0]=a[i];
        a[i]=t;
        size=size-1;
        max_heapify(a,0,size);
    }
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 17.05.2012 в 14:07.
Sweta вне форума Ответить с цитированием
Старый 17.05.2012, 14:08   #3
mmd12
Новичок
Джуниор
 
Регистрация: 17.05.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
Попробую предположить, что где-то здесь
i
Код:
nt partition(int *a, int p, int r)
{
 
    int t,k,x,i;
 
    x=a[r];
    i=p-1;                 //i=-1
 
    for(int j=p; j<=(r-1); j++)
    {
        if(a[j]<=x)
        {
            i++;           //j=0 i=0;...j=4 i=4
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
 
    k=a[i+1];      //i+1 =5 вышли за предел массива
    a[i+1]=a[r];
    a[r]=k;
 
    return (i+1);
 
}
и здесь тоже
Код:
void heapsort(int *a, int i, int size)
{
    int t=0;
 
    build_max_heap(a,i,size);
 
    for(int i=size; i>=1; i--) //i=size, наверное i=size-1, т.к выходим за массив
    {
        t=a[0];
        a[0]=a[i];
        a[i]=t;
        size=size-1;
        max_heapify(a,0,size);
    }
нет, я уже пробывал это, у человека который компилировал у себя этот же код все работает нормально, не понимаю что за бред?
mmd12 вне форума Ответить с цитированием
Старый 17.05.2012, 14:13   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

У меня Builder. Нормально не работает. Попробуйте через отладчик пошагово с небольшим количеством элементов и просмотром значения переменных.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 17.05.2012, 14:14   #5
mmd12
Новичок
Джуниор
 
Регистрация: 17.05.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
У меня Builder. Нормально не работает. Попробуйте через отладчик пошагово с небольшим количеством элементов и просмотром значения переменных.
он сортирует всегда правльно, только бывает этот нуль в начале и е дописывает в конце, а иногда все нормально отображает, не могу сказать с какой вероятностью


все теперь работает
всем спасибо

Последний раз редактировалось mmd12; 17.05.2012 в 22:42.
mmd12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка двумерного массива по столбцам методом быстрой сортировки( Хоара) и пирамидальной. tworc22 Помощь студентам 3 28.10.2011 23:05
Проблема с алгоритмом быстрой сортировки maryan.vetrov Общие вопросы C/C++ 2 31.08.2010 18:56
Вопросы насчёт быстрой сортировки(С++) Stopafilm Помощь студентам 2 01.08.2010 10:43
Метод быстрой сортировки Nord18 Паскаль, Turbo Pascal, PascalABC.NET 1 05.06.2010 11:24
Метод быстрой сортировки Хоора Pascal Бармалей Помощь студентам 8 18.11.2009 21:21