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

Шейкерная сортировка без использования while цикла

29.08.2015, 05:46. Показов 2740. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, сделал шейкерную сортировку через два вложенных цикла - не работает. Не могу понять в чем проблема, подскажите пожалуйста.
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
int x;
    for (int i = N - 1; i > 0; i--)
    {
        if (i % 2 == 0)
        {
            for (int j = N-1; j <= i; j--)
            {
                if (a[j] < a[j - 1])
                {
                    x = a[j];
                    a[j - 1] = a[j];
                 a[j - 1]=x;
                }
            }
        }
        else if (i % 2 != 0)
        {
            for (int j = 0; j <= i;j++)
            if (a[j]>a[j + 1])
            {
                x = a[j];
                a[j] = a[j + 1];
                 a[j + 1]=x;
            }
        }
    }
    cout << endl;
    for (int i = 0; i < N; i++)
    {
        cout << a[i]<<endl;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2015, 05:46
Ответы с готовыми решениями:

Обнуление динамического массива без использования цикла
Как обнулить дин. массив? (без цикла). Для определённого массива можно написать вот так: int array {}; А для динамического? Например int...

Вывод массива без использования цикла на C(pure))
Какие есть мысли и/или готовые решения по сабжу ?

Как обойти массив без использования цикла
С помощью рекурсии

6
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.08.2015, 13:39
Миха_ил, обрати внимание на условие цикла:
C++
1
for (int j = N-1; j <= i; j--)
Добавлено через 1 час 59 минут
main.cpp
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
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    #include <numeric>
     
    int main() {
        const std::size_t size = 10;
        std::vector< int > v = {7, 8, 2, 9, 1, 3, 6, 5, 0, 4};
     
        std::cout << "До сортировки: " << std::endl;
        std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", "));
    //--- sort start
        std::size_t cntP = 0;
        std::size_t cntS = 0;
        std::size_t cntZ = 0;
        bool swapped = true;
        for (std::size_t i = 0; i < size && swapped; ++i)
        {
            swapped = false;
            ++cntP;
            for (std::size_t j = (i % 2) ? 0 : 1; j < size - 1; j += 2)
            {
                ++cntS;
                if (v[j] > v[j + 1])
                {
                    swapped = true;
                    ++cntZ;
                    std::swap(v[j], v[j + 1]);
                }
            }
        }
    //--- sort end
        std::cout  << std::endl; 
        std::cout  << "После сортировки: " << std::endl;
        std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", "));
     
        std::cout  << std::endl;
        std::cout  << "Количество проходов: "     << cntP << std::endl;
        std::cout  << "Количество сравнений: "   << cntS << std::endl;
        std::cout  << "Количество замен: "       << cntZ << std::endl;
     
        return 0;
    }
std out
Code
1
2
3
4
5
6
7
До сортировки: 
7, 8, 2, 9, 1, 3, 6, 5, 0, 4, 
После сортировки: 
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
Количество проходов: 9
Количество сравнений: 40
Количество замен: 29
Ссылка на запуск: http://ideone.com/RtqySV
1
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
29.08.2015, 16:39  [ТС]
C++
1
for (std::size_t j = (i % 2) ? 0 : 1; j < size - 1; j += 2)
Непонятно вот это выражение
C++
1
j = (i % 2) ? 0 : 1
. Тут j принимает, как четные так и нечетные значения, я правильно понимаю?

И не совсем понимаю, как тут работает булевая переменная(
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
29.08.2015, 17:54
Интересно, что означает название этой темы, какой смысл вкладывал в него ТС? С какой стороны не посмотри - фигня получается.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
29.08.2015, 19:45
Миха_ил, а почему именно без while? Ведь по сути все 3 вида циклов взаимозаменяемы.
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.08.2015, 22:04
Миха_ил, в название написано шейкерная сортировка, а в твоем коде франкинштейн четной-нечотной + шейкерной.
(i % 2) ? 0 : 1 возвращает ноль, если операция (i % 2) возвращает истину, если возвращает ложь, то (i % 2) ? 0 : 1 вернет единицу.
это равносильно записи:
C++
1
2
3
4
if( (i % 2) == 1 ) 
j = 0;
else if ( (i % 2) == 0)
j = 1;
Булевую переменную можно убрать, я просто модифицировал алгоритм дабы лишних проходов не делал, если уже все отсортировано.

Вот ссылка на статью в википедии
И ссылка на статью хабры

Возможно так будет понятней:
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
        for (int i = 0; i < N ; ++i)
        {
            if ( i % 2 == 0 )
            {
                for (int j = 1; j < N - 1; j += 2)
                {
                    if ( a[j] > a[j + 1] )
                    {   
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = a[j];
                    }
                }
            } else if ( i % 2 != 0 )
            {
                for (int j = 0; j < N - 1; j += 2)
                {
                    if ( a[j] > a[j + 1] )
                    {   
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = a[j];
                    }
                }
            }
        }
1
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
29.08.2015, 23:26  [ТС]
QVO, спасибо большое, хахах у меня действительно франкинштейн
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2015, 23:26
Помогаю со студенческими работами здесь

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

Возможно ли без использования цикла получить символ с конца нулевого аргумента main()?
Использую имя файла как аргумент для предварительной настройки программы. Хочу без помощи поиска в цикле получить пред-пред-пред последний...

Сортировка, без использования массивов
Скажите, пожалуйста, можно-ли, имея в &quot;распоряжении&quot; только операторы выбора и циклы(никаких массивов!) выполнить следующее задание: ...

Сортировка файла без использования массивов
помогите, плиз, задачка простенькая. (не знаю, как отсортировать без массива) дан файл целых чисел, отсортировать его, не используя...

Шейкерная сортировка массива
Не удается с внизсходящего поменять сортировку на вверхсходящую #include &lt;iostream&gt; #include &lt;windows.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru