сортиране масиви
Цел клас са както разпорежда елементи масив.
Shake сортиране се използва широко в случаите, в които е известно, че елементите са подредени почти
Да предположим, че ние организираме масива във възходящ ред. След първото преминаване, "балон", най-големият елемент на масива ще си дойде на мястото. Извършване на второ преминаване напротив, от първия до предпоследния елемент. След този пасаж си дойде на мястото на най-малкия елемент. И ние ще изпълним нашата гама от пасажи: странния ляво - дясно, а дори и в дясно - на ляво. В същото време по странни движения ще заеме своето място на най-голямото перо (от ляво), а най-малко странно (и оставащото).
Не забравяйте, че са били или не са били промените в хода на един пасаж.
Не забравяйте, не само на факта, че размяната се състоя, но също така и позицията (индекс) на последното борса.
В лявата граница = брой на първия елемент
В дясната граница = брой на последния елемент
Докато лявата граница <Правой границы делать
Прав чрез "балони" от лявото поле в дясно-1
Дясната граница = дясната граница - 1
Обратното преминаване "балончета" от десния край на ляво + 1
Лява граница = наляво граница + 1
Сортиране масиви. Shell вид.
Цел клас са както разпорежда елементи масив.
Това сортиране 9) се основава на вече познатите ни прост алгоритъм вмъква PrVst. Смисълът й е да се разделят сортиране метод PrVst няколко части, в които оригиналния масив. Тези дялове помагат за намаляване на броя на пратките: с цел да се направи "правилната" място за следващия елемент, трябва да има по-малък брой елементи на смени.
На всяка стъпка (макар и променлива тона притежава тази стъпка номер) трябва да направите следното:
- изолиране на всички последователности, разстоянието между елементите, които е кт;
- Всеки един от тези под-последователности от PrVst вид.
Намирането намаляваща последователност отдалечава кт. KT-1. , k1 е основният проблем на този алгоритъм. Многобройни проучвания са показали своите свързващи свойства:
- k1 = 1;
- за всички т кт> KT-1;
- Желателно е също така, че всички кт не са кратни на един друг (с цел да се избегне повторен обработка на предварително сортират елементи).
Доналд Кнут предлага два "добрите" разстояния последователност:
Първият от тях е подходящ за сортиране масиви достатъчно дълго, втората е по-удобно за по-кратко. Ето защо, ние ще го спре върху него (който желаете да програмирате първата опция дава възможност да се направят необходимите промени в изпълнението на текста на алгоритъма).
Как да се определи първоначалната стойност за тон (а с него и, разбира се, и за к-т)?
Може, разбира се, стъпка по стъпка, за да се провери дали изолатът от подпоследователност сортираната масив (поне дължина 2) на разстояние от 1, 3, 7, 15, и т.н. между нейните елементи. Въпреки това, този метод е доста неефективен. Ние действа по различен начин, защото имаме формула за изчисляване кт = 2т -1.
По този начин, дължината на нашия масив (N) трябва да попада в тези граници:
или това, което е едно и също,
2 тон <= N <2 t+1
Логаритъм на тези неравенства (база 2):
т <= log N По този начин, става ясно, че т може да се изчисли по следната формула: За съжаление, език Паскал допуска само логаритъма при основа д (натурален логаритъм). Така че ние трябва да помним, познатата гимназията Курсът на лечение обикновено "трансформация" на логаритми: В този случай, m = 2, Z = напр. По този начин, за да се получи първоначално Т: Въпреки това, с тази т част от подпоследователност ще има дължина от 2, и част - и 1. сортиране като последователност е необходимо, следователно, не незабавно отнема още 1 етап: Разстоянието между елементите във всеки суб-последователност се изчислява както следва: Броят на под-последователности ще бъде точно равна на к. В действителност, всяка от първите к елементи е отправна точка за следващата подпоследователност. И тогава, като се започне с (к + 1)-ти, всички елементи, които вече са членове на някои по-рано се появи последователност, тогава няма нова последователност няма да може да започне в средата на масива. Колко елемента ще бъдат включени във всяка последователност? Отговорът е, че ако дължината на цялата сортирани последователност (N) може да бъде разделена в етап к без остатък, тогава всички суб-последователност ще имат същата дължина, а именно: Ако N не се дели равномерно етап к, първите п последователности ще бъдат повече от 1. Броят на такива "удължени" последователност съвпада с дължината на "опашка" - модул N в етап к: