Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Заблокирован

сортировка хоара

08.08.2013, 13:48. Показов 2387. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void QuickSort(int* const a, int low, int N)
{
    int i = low, j = N;        
    int temp, p;
    p = a[(low+N)/2];   
    do {
        while (a[i] < p) i++;
        while (a[j] > p) j--;
 
        if (i <= j) {
            temp = a[i]; 
            a[i] = a[j]; 
            a[j] = temp;
            i++; j--;
         }
       } while (i <= j);
 
 
 
    if(j > low) 
        QuickSort(a, low, j);
    if(i < N) 
        QuickSort(a, i, N);
}
int main()
{
    int mas[6] = {6,3,7,1,2,5};
    int* pmas = mas;
    QuickSort(pmas, 0, sizeof(mas)/sizeof(int));
    std::copy(mas, mas + sizeof(mas)/sizeof(int), std::ostream_iterator<int>(std::cout, "\n"));
    system("pause");
    return 0;
}
Добавлено через 1 минуту
не работает как надо. плюс не понятен момент при первом заходе в цикл do while, что происходит в первых 2 циклах while. в них вообще не заходит?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2013, 13:48
Ответы с готовыми решениями:

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива
Мне нужно отсортировать фрагмент массива, расположенный между первым и последним отрицательным элементом. Немогу понять как устоновить...

C/C++ FAQ :: Быстрая сортировка (сортировка Хоара)
Вопрос, скорее академический, по мотивам реализации. Вот в faq приведена реализация этого метода сортировки на C++. В коде есть следующий...

11
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
08.08.2013, 13:51
Ты сортируешь массив из семи элементов, а значения присвоил только шести...
Если написать так:

C++
1
2
3
    int mas[] = {6,3,7,1,2,5};
    int* pmas = mas;
    QuickSort(pmas, 0, 6);
то все прекрасно работает.
0
Заблокирован
08.08.2013, 13:57  [ТС]
у меня при первом заходе в цикл do while после циклов while индексы равны 0 и 6, хотя переменная p = 1? почему?

Добавлено через 1 минуту
косяк, но это не столь важно до этого там их было 7

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
 do {
        while (a[i] < p) i++;
        while (a[j] > p) j--;
        std::cout << i << j;
        if (i <= j) {
            temp = a[i]; 
            a[i] = a[j]; 
            a[j] = temp;
            i++; j--;
         }
       } while (i <= j);
после первого захода у меня индексы i и j равны 0 и 6. то есть не в один цикл while программа не заходит, но почему?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
08.08.2013, 14:03
Цитата Сообщение от ТОрчОК Посмотреть сообщение
индексы равны 0 и 6, хотя переменная p = 1? почему?
- давай посмотрим:

low=0; N=6; -> low+N=6 -> (low+N)/2=3 -> p=a[3]=1 (см. свой массив). Что не так?

Добавлено через 3 минуты
Цикл
C++
1
while (a[i] < p) i++;
не прорабатывает ни разу, т.к. первый же i-й элемент больше p
0
Заблокирован
08.08.2013, 14:17  [ТС]
это я понял, а вот
C++
1
while (a[j] > p) j--;
здесь j = N = 6 и цикл тоже не срабатывает ни разу, хотя все элементы больше чем р

Добавлено через 11 минут
никак не пойму
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
08.08.2013, 14:28
Вставим отладочную печать:

C++
1
2
3
4
5
6
7
8
9
    do {
        while (a[i] < p) i++;
        while (a[j] > p) j--;
 
cout << "p=" << p << endl;
cout << "i=" << i << endl;
cout << "j=" << j << endl << endl;
 
/////
И убеждаемся, что все меняется, как и положено:

p=1
i=0
j=3 !!!

p=1
i=1
j=0

p=6
i=2
j=5

p=6
i=3
j=4

p=5
i=2
j=3

p=3
i=1
j=2

p=7
i=5
j=5

1 2 3 5 6 <- результат
Press any key to continue
1
Заблокирован
08.08.2013, 14:33  [ТС]
у меня все совершенно по другому

для первого:
p=1
i=0
j=6

остальное тоже, в чем может быть причина?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
08.08.2013, 14:39
Выложи свой код с отл. печатью
0
Заблокирован
08.08.2013, 14:58  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void QuickSort(int* const a, int low, int N)
{
    int i = low, j = N;        
    int temp, p;
    p = a[(low+N)/2];   
    do {
        while (a[i] < p) i++;
        while (a[j] > p) j--;
    std::cout << "p=" << p << std::endl;
        std::cout << "i=" << i << std::endl;
        std::cout << "j=" << j << std::endl << std::endl;
        if (i <= j) {
            temp = a[i]; 
            a[i] = a[j]; 
            a[j] = temp;
            i++; j--;
         }
       } while (i <= j);
 
    if(j > low) 
        QuickSort(a, low, j);
    if(i < N) 
        QuickSort(a, i, N);
}
int main()
{
    int mas[6] = {6,3,7,1,2,5};
    int* pmas = mas;
    QuickSort(pmas, 0, 6);
    std::copy(mas, mas + 6, std::ostream_iterator<int>(std::cout, "\n"));
    system("pause");
    return 0;
}
Добавлено через 16 минут
p=1
i=0
j=6

p=1
i=1
j=3

p=1
i=2
j=1

p=-858993460
i=0
j=0

p=2
i=2
j=4

p=2
i=3
j=2

p=7
i=4
j=6

p=7
i=6
j=5

p=6
i=4
j=5

p=3
i=3
j=3
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
08.08.2013, 15:13
Я немного ошибся: поставь в 29-й строке

C++
1
QuickSort(pmas, 0, 5); // ведь индекс последнего эл-та = 5 (а не 6)
и посмотри, что будет
1
Заблокирован
08.08.2013, 15:25  [ТС]
ну все равно в цикл
C++
1
while (a[j] > p) j--;
при первом заходе в do while не входит
0
Ghost
 Аватар для Belfegor
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
08.08.2013, 15:32
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
 
using namespace std;
 
template < typename T, typename X, typename Y>
void QuickSort(vector <T> &v, X b0, Y e0) {
    auto e = e0;
    auto d = v[e];
    auto b = b0;
    do {
        while (v[b] < d)
            ++b;
        while (v[e] > d)
            --e;
        if (b <= e) {
            swap(v[b], v[e]);
            ++b;
            --e;
        }
    } while (b <= e);
    if (e > b0) {
        QuickSort(v, b0, e);
    }
    if (b < e0) {
        QuickSort(v, b, e0);
    }
}
 
int main() {
    vector < int > v;
    for (int i = 0; i < 20; i++) {
        v.push_back(i);
    }
    for (int i = 0; i < v.size(); i++) {
        swap(v[i], v[rand() % (v.size() - i) + i]);
    }
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << endl;
    QuickSort(v, 0, v.size() - 1);
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << endl;
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2013, 15:32
Помогаю со студенческими работами здесь

Быстрая сортировка (сортировка методом Хоара)
Ввести массив x1,x2,...,x20 в диапазоне . Требуется расположить отрицательные элементы в порядке убывания. Вывести массивы до и после...

Сортировка Хоара
Нужно добавить функцию которая сортирует по убыванию роста методом Хоара. Все остальное сделал а быструю сортировку реализовать не...

Сортировка Хоара
помогите правильно вставить счетчик шагов. Насколько я понял, функция сама себя перезапускает, тоесть надо в тело функции кидать, но так...

Сортировка Хоара / Быстрая сортировка
Доброго времени суток. Написал реализацию алгоритма быстрой сортировки. void SortHhoar(int *arr,int f,int l)//Хоара { int mid = (f...

Сортировка методом Хоара
Дали задание 1. Пусть дано массив a1, a2, ..., an. Необходимо переставить его элементы так, чтобы сначала шла группа элементов, больших...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru