Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
_Mars_
0 / 0 / 0
Регистрация: 13.10.2013
Сообщений: 37
#1

Шейкер сортировка - C++

13.10.2013, 15:37. Просмотров 2216. Ответов 4
Метки нет (Все метки)

Здравствуйте. Столкнулся с задачей реализации Шейкер сортировки .Почитал теорию и понял , что она очень похожа на пузырьковую. Но столкнулся с примером кода и стало совсем ничего не понятно .
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
using namespace std;
 
int array[100];
 
void Sort(int col)
{
int trash=0;
bool f=true;
for (int i=1; (i<=col) && (f=true) ; i++)
{
f=false;
// проходим с лева на право
for (int j=i; j<=col-i; j++)
{   
// если число слева больше числа
if (array [j]>array [j+1]) 
{
// справа, то меняем местами
trash=array[j];
// справа собираются большие числа
array [j]=array [j+1];
array [j+1]=trash;
f=true;
}
}
 
// проходим с права на лево
for (int j=col-i-1; j>i ; j--)
{
// если число справа меньше числа
if (array [j]<array[j-1]) 
{
// слева, то меняем местами
trash=array[j];
// слева собираются меньшие числа
array [j]=array [j-1]; 
array [j-1]=trash; 
f=true; 
} 
} 
}
}
 
// вывод
void Out(int col)
{
for (int i=1; i<=col; i++)
cout << array [i] <<" ";
cout << endl;
}
 
// главная
int main()
{
int col_el;
 
// ввод данных 
cout << " Enter length of array"<< endl;
cin >> col_el; 
cout << " Enter array elements"<<endl; 
for (int n=1; n<=col_el ; n++) 
{
cout <<n<<" :" << "\t"; 
cin >> array[n];
}
 
// сортировка
Sort(col_el); 
 
// вывод результата
cout << "Result is :"<<endl; 
Out(col_el); 
cin >> col_el; 
 
return 0;
}
Я понял с прочитанного, что суть алгоритма в том, что данные сортируются "волнообразно", при этом программа сначала проходит массив слева направо, а потом справа налево. Когда идем слева, то собираем справа большие числа, а когда справа, то собираем слева меньшие.
Но вот как работает всё -нет .
Может кто сможет объяснить по простому , как работает сортировка Шейкера? Например , на числах 2,6,1,10,3
Как происходит сортировка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2013, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шейкер сортировка (C++):

Шейкер Сортировка - C++
Дано N целых чисел от -50 до 50. Упорядочить их за нарастанием. Используйте Шейкер сортировку. Прошу использовать &quot;stdafx.h&quot;, а не...

Шейкер сортировка - C++
Нород помогите пожалуйста сделать эту задачу! нужно ее сделать через шейкер сортировку! Данный одномерный массив целых чисел&gt; 10....

Шейкер сортировка двумерного массива - C++
Помогите написать функцию шейкер сортировки для двумерного массива, в интернете смог найти пример только для одномерного

Ошибка в программе. Шейкер-сортировка - C++
Дан файл со строкой чисел. Числа в рандомном порядке. Необходимо упорядочить их. #define _CRT_SECURE_NO_WARNINGS #include &lt;cstdio&gt; ...

Шейкер Сортировка! Непонятны некоторые моменты - C++
Столкнулся с задачей реализации Шейкер сортировки .Почитал теорию и понял , что она очень похожа на пузырьковую. Но столкнулся с примером...

Как будет выглядеть блок-схема шейкер сортировки для данного кода? - C++
код: #include &lt;iostream&gt; using namespace std; //функция обмена void Swap(int *Mas, int i) { int temp; temp=Mas; Mas=Mas; ...

4
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
13.10.2013, 16:04 #2
_Mars_, 2,6,1,10,3
проход 1: 2 1 6 3 10 (слева направо) -- обмен 6-1 и 10-3
проход 2: 1 2 3 6 10 (справа налево) -- обмен 6-3 и 2-1
0
_Mars_
0 / 0 / 0
Регистрация: 13.10.2013
Сообщений: 37
13.10.2013, 16:24  [ТС] #3
Цитата Сообщение от newb_programmer Посмотреть сообщение
_Mars_, 2,6,1,10,3
проход 1: 2 1 6 3 10 (слева направо) -- обмен 6-1 и 10-3
проход 2: 1 2 3 6 10 (справа налево) -- обмен 6-3 и 2-1
это я уже понял ,когда всё нарисовал на листочке и прорешал вручную
меня интересует пример кода :
C++
1
2
3
4
5
int trash=0;   //для чего это?
bool f=true;         //..и это?
 
.....
for (int i=1; (i<=col) && (f=true) ; i++)   - что выполняется в этом цикле?
Помогите , пожалуйста , разобраться . Буду очень благодарен любой помощи !
0
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
13.10.2013, 16:28 #4
_Mars_,
C++
1
int trash=0;
переменная через которую происходит обмен элементов, обычно ее называют temp
тип этого...
C++
1
2
3
temp=a;
a=b;
b=temp;
C++
1
bool f=true;         //..и это?
это флаг по которому происходит смена направлений проходов

C++
1
for (int i=1; (i<=col) && (f=true) ; i++)   - что выполняется в этом цикле?
цикл прохода массива справа на лево
1
_Mars_
0 / 0 / 0
Регистрация: 13.10.2013
Сообщений: 37
13.10.2013, 16:44  [ТС] #5
Цитата Сообщение от newb_programmer Посмотреть сообщение
_Mars_,
C++
1
int trash=0;
переменная через которую происходит обмен элементов, обычно ее называют temp
тип этого...
C++
1
2
3
temp=a;
a=b;
b=temp;
C++
1
bool f=true;         //..и это?
это флаг по которому происходит смена направлений проходов

C++
1
for (int i=1; (i<=col) && (f=true) ; i++)   - что выполняется в этом цикле?
цикл прохода массива справа на лево
всё равно запутался с этим флагом :изначально он true, но когда входим в цикл , он стает false , а затем опять true- я не пойму - почему ?

C++
1
for (int i=1; (i<=col) && (f=true) ; i++)
-как понять , что справа на лево? не могу разобраться, что за условие границы
C++
1
(i<=col) && (f=true)
-пока i меньше количества элементов и флаг=тру? что это значит?

и вот здесь ещё цикл:
C++
1
2
3
for (int j=i; j<=col-i; j++) // почему именно слева направо?
 
for (int j=col-i-1; j>i ; j--)  //почему именно справа налево?что за такие условия в цикле ?
например есть числа 2,6,1,10,3
col=5 получается

Извините за такое количество вопросов , но я уже и нарисовал , и понял как оно сортируется , но вот с этими циклами и условиями совсем запутался , а так хочется разобраться нормально..
Помогите , пожалуйста , новичку . Расскажите подробненько) Надеюсь на Вашу помощь .
0
13.10.2013, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 16:44
Привет! Вот еще темы с ответами:

Составить блок – схемы для шейкер- сортировки и сортировки Шелла - C++
Доброго времени суток, очень нужна ваша помощь в решении данной проблемы, буду бесконечно благодарен. Составить блок – схемы для шейкер-...

Сортировка Шелла. Написал программу, не могу понять, почему сортировка не выполняется - C++
Программа создает динамический массив с рандомным заполнением. Дальше выбор сортировок, пузырьком или сортировка Шелла. Вот она то и не...

Сортировка слиянием. В каком куске кода происходит сортировка и каким именно образом? - C++
Помогите, пожалуйста, разобраться. Подскажите в каком куске кода происходит сортировка и каким именно образом? #include &lt;iostream&gt; ...

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


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

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

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