Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Шейкерная сортировка ⇐ ПредыдущаяСтр 2 из 2
44 06 06 06 06 06 06 06 55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18 42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94 12 18 42 44 55 67 94 06 94 06 12 18 42 44 55 67 Сортировка Шелла 44 55 12 42 94 18 06 67 44 18 06 42 94 55 12 67 06 18 12 42 44 55 94 67 06 12 18 42 44 55 67 94 Задан массив a[0].. a[15]
1. Вначале сортируем простыми вставками каждые 8 групп из 2-х элементов (a[0], a[8[), (a[1], a[9]),..., (a[7], a[15])
Потом сортируем каждую из четырех групп по 4 элемента (a[0], a[4], a[8], a[12]),..., (a[3], a[7], a[11], a[15])
В нулевой группе будут элементы 4, 12, 13, 18, в первой - 3, 5, 8, 9 и т.п. 3. Далее сортируем 2 группы по 8 элементов, начиная с (a[0], a[2], a[4], a[6], a[8], a[10], a[12], a[14])
В конце сортируем вставками все 16 элементов int increment(long* inc, long size) { int p1, p2, p3, s; p1 = p2 = p3 = 1; s = -1; do { if (++s % 2) { inc[s] = 8*p1 - 6*p2 + 1; } else { inc[s] = 9*p1 - 9*p3 + 1; p2 *= 2; p3 *= 2; } p1 *= 2; } while(3*inc[s] < size); return s > 0? --s: 0; } void shellSort(long* a, long size) {long inc, i, j, seq[40]; int s; // вычисление последовательности приращенийs = increment(seq, size); while (s > = 0) { // сортировка вставками с инкрементами inc[] inc = seq[s--]; for (i = inc; i < size; i++) { long temp = a[i]; for (j = i-inc; (j > = 0) & & (a[j] > temp); j -= inc) a[j+inc] = a[j]; a[j+inc] = temp; } }} Сравнение рассмотренных сортировок
|