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

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

29.08.2015, 05:46. Показов 1638. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2015, 05:46
Ответы с готовыми решениями:

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

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

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

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

6
649 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.08.2015, 13:39 2
Миха_ил, обрати внимание на условие цикла:
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
Код
До сортировки: 
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  [ТС] 3
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
2605 / 2195 / 234
Регистрация: 03.07.2012
Сообщений: 7,916
Записей в блоге: 1
29.08.2015, 17:54 4
Интересно, что означает название этой темы, какой смысл вкладывал в него ТС? С какой стороны не посмотри - фигня получается.
0
801 / 531 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
29.08.2015, 19:45 5
Миха_ил, а почему именно без while? Ведь по сути все 3 вида циклов взаимозаменяемы.
0
649 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.08.2015, 22:04 6
Миха_ил, в название написано шейкерная сортировка, а в твоем коде франкинштейн четной-нечотной + шейкерной.
(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  [ТС] 7
QVO, спасибо большое, хахах у меня действительно франкинштейн
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2015, 23:26

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.