сортиране масиви

Цел клас са както разпорежда елементи масив.

Shake сортиране се използва широко в случаите, в които е известно, че елементите са подредени почти

Да предположим, че ние организираме масива във възходящ ред. След първото преминаване, "балон", най-големият елемент на масива ще си дойде на мястото. Извършване на второ преминаване напротив, от първия до предпоследния елемент. След този пасаж си дойде на мястото на най-малкия елемент. И ние ще изпълним нашата гама от пасажи: странния ляво - дясно, а дори и в дясно - на ляво. В същото време по странни движения ще заеме своето място на най-голямото перо (от ляво), а най-малко странно (и оставащото).

Не забравяйте, че са били или не са били промените в хода на един пасаж.

Не забравяйте, не само на факта, че размяната се състоя, но също така и позицията (индекс) на последното борса.

В лявата граница = брой на първия елемент

В дясната граница = брой на последния елемент

Докато лявата граница <Правой границы делать

Прав чрез "балони" от лявото поле в дясно-1

Дясната граница = дясната граница - 1

Обратното преминаване "балончета" от десния край на ляво + 1

Лява граница = наляво граница + 1

Сортиране масиви. Shell вид.

Цел клас са както разпорежда елементи масив.

Това сортиране 9) се основава на вече познатите ни прост алгоритъм вмъква PrVst. Смисълът й е да се разделят сортиране метод PrVst няколко части, в които оригиналния масив. Тези дялове помагат за намаляване на броя на пратките: с цел да се направи "правилната" място за следващия елемент, трябва да има по-малък брой елементи на смени.

На всяка стъпка (макар и променлива тона притежава тази стъпка номер) трябва да направите следното:

  1. изолиране на всички последователности, разстоянието между елементите, които е кт;
  2. Всеки един от тези под-последователности от 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 в етап к: