Консультация № 174662
28.11.2009, 23:46
0.00 руб.
0 8 1
Здраствуйте Уважаемые эксперты. Может у кого есть программа на С++ которая реализует алгоритм быстрой сортировки без использования стека(желательно с коментариями)? Или же ссылка, я искал, только на паскале находил, там со стеком.. Тяжело в общем переписать на borland c++ 3.1. Заранее благодарен.

Обсуждение

Неизвестный
29.11.2009, 00:17
общий
Dimon4ik:
Вобщем есть стандартная функция в stdlib.h - qsort
http://codelab.ru/task/quick_sort:basic/
http://ru.wikibooks.org/wiki/Примеры_реализации_быстрой_сортировки
давно
Посетитель
7438
7205
29.11.2009, 01:39
общий
А чем стек не угодил?
Суть этого метода - рекурсия, которую без стека трудно представить.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.11.2009, 10:37
общий
Прото никогда не работал со стеком. Но, если Вы говорите, то был бы рад увидеть.
Неизвестный
29.11.2009, 11:04
общий
Dimon4ik:
Доброе утро!
Код:

#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int> &a, int l, int r);
void qs(vector<int> &a, int l, int r);


int main()
{
vector<int> a;
a.push_back(9);
a.push_back(3);
a.push_back(1);
a.push_back(5);
a.push_back(8);
a.push_back(2);
a.push_back(4);
a.push_back(7);

qs(a,0,a.size()-1);
for(int i=0;i<8; i++)
cout << a[i]<< " ";
return 0;

}

void qs(vector<int> &a, int l, int r)
{
if(l<r)
{
int s=partition(a,l,r);
qs(a, l, s - 1);
qs(a, s + 1, r);
}
}

int partition(vector <int> &a,int l,int r)
// Introduction to Algorithmes
// Cormen, Leiserson, Rivest
{
int x=a[r];
int i=l-1;
int j;
for (j=l; j<=r-1; ++j) {
if (a[j]<=x) {
i=i+1;
swap(a[i], a[j]);
}
}
swap(a[i+1], a[r]);
return i+1;
}



Есть еще пример в Керниган_Ричи, Глава 4. Функции и структура программы, 4.10 Рекурсия.


Неизвестный
29.11.2009, 11:06
общий
leonid59:
Спасибо. Постараюсь разобраться.
давно
Старший Модератор
17042
808
30.11.2009, 04:45
общий
leonid59:
А чего же в мини-форуме? Подайте как ответ. Вам - рейтинг, мне - закрытый вопрос.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
30.11.2009, 21:40
общий
leonid59:
Если не дадите ответ сами, мне придётся сделать это за Вас!
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Академик
320937
2216
01.12.2009, 19:29
общий
это ответ
Здравствуйте, Dimon4ik. В приложении две программы: C (по Кернигану&Ричи), С++ (по Кормен, Лейзерсон, Ривест "Алгоритмы. Построение и анализ". Комментарии Кернигана и Ричи понятные.

Приложение:
#include <stdio.h>
/* Керниган, Ричи, Язык программирования Си, 2-е издание */
/* Глава 4. Функции и сруктура программы, стр.100 */

/*
Следующий хороший пример рекурсии - это быстрая сортировка,
предложенная Ч.А.Р. Хоаром в 1962 г.
Для заданного массива выбирается один элемент, который разбивает
остальные элементы на два подмножества - те, что меньше, и те,
что не меньше него. Та же процедура рекурсивно применяется и к двум
полученным подмножествам. Если в подмножестве менее двух элементов,
то сортировать нечего, и рекурсия завершается. Наша версия быстрой
сортировки, разумеется, не самая быстрая среди всех возможных,
но зато одна из самых простых.
В качестве делящего элемента мы используем серединный элемент.
*/
/* qsort: сортирует v[left]...v[right] по возрастанию */
void qsort(int v[], int left, int right)
{
int i, last;
void swap(int v[], int i, int j);

if (left >= right) /* ничего не делается, если */
return; /* в массиве менее двух элементов */
swap(v, left, (left + right)/2); /* делящий элемент */
last = left; /* переносится в v[0] */
for(i = left+1; i <= right; i++) /* деление на части */
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last); /* перезапоминаем делящий элемент */
qsort(v, left, last-1);
qsort(v, last+1, right);
}
/* swap: поменять местами v[i] и v[j] */
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}

int main()
{
int arr[] = {9,3,1,5,8,2,4,7};
int len = sizeof(arr)/sizeof(int);
for (int i=0; i<len; ++i)
printf("%d;", arr[i]);
printf("\n");

qsort(arr, 0,len-1);
for (int i=0; i<len; ++i)
printf("%d;", arr[i]);
printf("\n");

return 0;
}

/***********************************/
#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int> &a, int l, int r);
void qs(vector<int> &a, int l, int r);


int main()
{
vector<int> a;
a.push_back(9);
a.push_back(3);
a.push_back(1);
a.push_back(5);
a.push_back(8);
a.push_back(2);
a.push_back(4);
a.push_back(7);

qs(a,0,a.size()-1);
for(int i=0;i<8; i++)
cout << a[i]<< " ";
return 0;

}

void qs(vector<int> &a, int l, int r)
{
if(l<r)
{
int s=partition(a,l,r);
qs(a, l, s - 1);
qs(a, s + 1, r);
}
}

int partition(vector <int> &a,int l,int r)
// Introduction to Algorithmes
// Cormen, Leiserson, Rivest
{
int x=a[r];
int i=l-1;
int j;
for (j=l; j<=r-1; ++j) {
if (a[j]<=x) {
i=i+1;
swap(a[i], a[j]);
}
}
swap(a[i+1], a[r]);
return i+1;
}

Форма ответа