Участник:Satosik — различия между версиями
Satosik (обсуждение | вклад) (→Модификации) |
Satosik (обсуждение | вклад) (→Модификации) |
||
| Строка 42: | Строка 42: | ||
swap(array[i], array[i + jump]); | swap(array[i], array[i + jump]); | ||
swapped = true; | swapped = true; | ||
| + | |||
| + | Shakersort: | ||
| + | count=0 | ||
| + | for (int i = 0; i < n/2; i++) | ||
| + | beg = 0; | ||
| + | end = n - 1; | ||
| + | |||
| + | while beg<=end do | ||
| + | |||
| + | count += 2 | ||
| + | |||
| + | if a[beg] >a[beg + 1] | ||
| + | Swap(myint,beg,beg+1); | ||
| + | beg++ | ||
| + | if a[end-1] > a[end] | ||
| + | Swap(myint, end - 1, end); | ||
| + | end--; | ||
Версия 13:16, 13 июня 2014
Псевдокод
Ниже приведен псевдокод сортировки пузырьком, на вход которой подается массив .
BubbleSort(A)
for i = 0 to a.size - 2:
for j = 0 to a.size - 2:
if A[j] > A[j + 1]:
swap(A[j], A[j + 1]);
Для первой оптимизации точное количество сравнений зависит от исходного массива и в худшем случае составляет . Следовательно, .
Модификации
Сортировка чет-нечет - модификация пузырьковой сортировки, основанной на сравнении элементов стоящих на четных и нечетных позициях независимо друг от друга.
Сортировка расческой - модификация пузырьковой сортировки, основанной на сравнении элементов на расстоянии. По мере упорядочивания массива это расстояние уменьшается и как только оно достигает 1, массив "досортировывается" обычным пузырьком. Сложность - . Шаг 1 мы вычисляем k которое равно
Сортировка перемешиванием - разновидность пузырьковой сортировки, сортирующая массив в 2 направлениях на каждой итерации. В среднем, сортировка перемешиванием работает в 2 раза быстрее пузырька. Сложность - .
В оптимизированной версии точное количество сравнений зависит от исходного массива. Но точно известно, что их количество не меньше, чем количество обменов, и не больше, чем — максимальное количество сравнений для данной сортировки. Следовательно, .
odd-even_sort(a):
for (i = 0; i < n; ++i)
if (i mod 2 =0)
for (int j = 2; j < n; j+=2)
if (a[j] < a[j-1])
swap(a[j-1], a[j]);
else
for (j = 1; j < n; j+=2)
if (a[j] < a[j-1])
swap(a[j-1], a[j]);
combsort(a):
jump = n
bool swapped = true;
while (jump > 1 and swapped)
if (jump > 1)
jump /= 1.24733;
swapped = false;
for ( i = 0; i + jump < size; ++i)
if a[i + jump]< array[i])
swap(array[i], array[i + jump]);
swapped = true;
Shakersort:
count=0
for (int i = 0; i < n/2; i++)
beg = 0;
end = n - 1;
while beg<=end do
count += 2
if a[beg] >a[beg + 1]
Swap(myint,beg,beg+1);
beg++
if a[end-1] > a[end]
Swap(myint, end - 1, end);
end--;