sortare matrice

Clasa de obiectiv sunt la fel de a comanda elementele de matrice.

Sortarea Shake este utilizat pe scară largă în cazurile în care este cunoscut faptul că elementele sunt aranjate aproape

Să presupunem că aranja matrice în ordine crescătoare. După prima trecere, „bubble“, cel mai mare element al matrice va cădea în loc. Efectuați o a doua trecere pe dimpotrivă, de la primul element penultimul. După acest pasaj se încadrează în locul cel mai mic element. Și vom îndeplini oferta noastră de pasaje: stânga ciudat - dreapta, și chiar dreptul - la stânga. În același timp, pe pasele impare vor avea locul cel mai mare element (de la stânga), în timp ce cele mai mici ciudat (și rămase).

Amintiți-vă, au fost sau nu au fost modificări în cursul unui pasaj.

Amintiți-vă, nu numai faptul că schimbul a avut loc, dar, de asemenea, poziția (indicele) al ultimului schimb.

Granița stânga = numărul primului element

Granița dreapta = numărul ultimului element

În timp ce chenarul din stânga <Правой границы делать

Drept prin „bule“ de la marginea din stânga la dreapta-1

Marginea din dreapta a = marginea dreaptă - 1

pass „bule“ Reverse de la marginea din dreapta la stânga + 1

limita din stânga = limita din stânga + 1

Sortarea tablouri. Shell sortare.

Clasa de obiectiv sunt la fel de a comanda elementele de matrice.

Această sortare 9) se bazează pe deja cunoscut la noi algoritm simplu insereaza PrVst. Sensul său este de a separa sortare metoda PrVst mai multe părți în care matricea originală. Aceste partiții ajuta la reducerea numărului de transporturi: în scopul de a face locul „dreptul“ la elementul următor, trebuie să avem un număr mai mic de elemente de schimbare.

La fiecare pas (chiar dacă variabila t deține acest număr pas), trebuie să faceți următoarele:

  1. izola toate subsirurile, distanța dintre elementele care este kt;
  2. Fiecare dintre aceste sub-secvențe prin PrVst sortare.

Găsirea unei secvențe descrescătoare distanteaza kt. kt-1. . k1 este problema principală a acestui algoritm. Numeroase studii au evidențiat proprietățile sale de legare:

  • k1 = 1;
  • pentru toate t kt> kt-1;
  • de asemenea, este de dorit ca toate kt nu au fost multipli unul față de celălalt (în scopul de a evita prelucrarea repetată a elementelor sortate anterior).

Donald Knuth oferă două „bune“ distantele de secvență:

Primul este potrivit pentru sortarea arrays suficient de mult timp, a doua este mai convenabil pentru scurt. Prin urmare, vom opri pe el (care doresc să programeze prima opțiune, având în vedere posibilitatea de a face modificările necesare în punerea în aplicare a textului algoritmului).

Cum putem determina valoarea inițială pentru t (și cu ea, desigur, și pentru kt)?

Puteți, desigur, pas cu pas pentru a verifica dacă izolatul din subsecventa array sortat (cel puțin o lungime de 2), cu o distanță de 1, 3, 7, 15, etc. între elementele sale. Cu toate acestea, această metodă este destul de ineficientă. Noi acționăm în mod diferit, pentru că avem o formulă pentru a calcula kt = 2 t -1.

Astfel, lungimea matrice noastre (N) trebuie să se încadreze în aceste limite:

sau ceea ce este același lucru,

2 t <= N <2 t+1

Logaritm acestor inegalități (baza 2):

T <= log N

Astfel, a devenit clar că t poate fi calculată cu următoarea formulă:

Din păcate, limbajul Pascal permite doar logaritmul e de bază (logaritm natural). Deci, trebuie să ne amintim cursul familiar de liceu, de obicei, „transformare“ a logaritmilor:

În acest caz, m = 2, z = e. Astfel, pentru a obține t inițial:

Cu toate acestea, cu acest T parte a subsecventa va avea o lungime de 2, și o parte - și la 1. sortare subsecvență nu este nevoie, prin urmare, să nu se retragă imediat încă 1 pas:

Distanța dintre elementele din orice subsecvență se calculează după cum urmează:

Numărul de sub-secvențe va fi exact egal cu k. De fapt, fiecare dintre primele elemente k este punctul de pornire pentru următoarea subsecventa. Și apoi, începând cu (+ 1 k) th, toate elementele sunt deja membre ale unora au apărut anterior subsequence, atunci nu subsecvență noi nu va fi capabil să înceapă în mijlocul matrice.

Câte elemente vor fi incluse în fiecare subsecvență? Răspunsul este că, dacă lungimea întregii secvențe sortate (N) poate fi împărțită în etapa k, fără rest, atunci toate sub-secvență va avea aceeași lungime, și anume:

Dacă N nu este divizibil pas uniform k, primele p ³irurile va fi mai mare de 1. Numărul de astfel de „alungit“ subsecventa coincide cu lungimea de „coada“ - modulo N în etapa k: