Js sortarea matricei după valoare. Informatică în JavaScript: Quicksort

Metoda sort() sortează elementele unui tablou la locși returnează matricea. Ordinea implicită de sortare este construită după conversia elementelor în șiruri de caractere, apoi comparând secvențele lor de valori ale unităților de cod UTF-16.

Complexitatea timpului și spațiului de acest fel nu poate fi garantată, deoarece depinde de implementare.

Sursa pentru acest exemplu interactiv este stocată într-un depozit GitHub. Dacă doriți să contribuiți la proiectul de exemple interactive, vă rugăm să clonați https://github.com/mdn/interactive-examples și să ne trimiteți o cerere de extragere.

Sintaxă arr .sort() Parametri compareFunction Opțional Specifică o funcție care definește ordinea de sortare. Dacă este omisă, matricea este sortată în funcție de valoarea punctului de cod Unicode a fiecărui caracter, în funcție de conversia șirului de caractere a fiecărui element. firstEl Primul element pentru comparație. secondEl Al doilea element pentru comparație. Valoare returnată

Matricea sortată. Rețineți că matricea este sortată la loc, și nu se face nicio copie.

Descriere

Dacă compareFunction nu este furnizată, toate elementele de matrice nedefinite sunt sortate prin conversia lor în șiruri și comparând șiruri în ordinea unităților de cod UTF-16. De exemplu, „banana” vine înainte de „cireș”. Într-o sortare numerică, 9 vine înaintea lui 80, dar deoarece numerele sunt convertite în șiruri, „80” vine înaintea „9” în ordinea Unicode. Toate elementele nedefinite sunt sortate până la sfârșitul matricei.

Notă: în UTF-16, caracterele Unicode de deasupra \uFFFF sunt codificate ca două unități de cod surogat, din intervalul \uD800 - \uDFFF . Valoarea fiecărei unități de cod este luată în considerare separat pentru comparație. caracterul format din perechea surogat \uD655\uDE55 va fi sortat Astfel înainte de caracterul \uFF3A .

Dacă se furnizează compareFunction, toate elementele matricei nedefinite sunt sortate în funcție de valoarea returnată a funcției de comparare (toate elementele nedefinite sunt sortate până la sfârșitul matricei, fără apel la compareFunction). Dacă a și b sunt două elemente comparate, atunci:

  • Dacă compareFunction(a, b) este mai mică decât 0, sortați a la un index mai mic decât b (adică a vine primul).
  • Dacă compareFunction(a, b) returnează 0, lăsați a și b neschimbate unul față de celălalt, dar sortați în funcție de toate elementele diferite. Notă: standardul ECMAscript nu garantează acest comportament și, prin urmare, nu toate browserele (de exemplu, versiunile Mozilla care datează cel puțin din 2003) respectă acest lucru.
  • Dacă compareFunction(a, b) este mai mare decât 0, sortați b la un index mai mic decât a (adică b este primul).
  • compareFunction(a, b) trebuie să returneze întotdeauna aceeași valoare atunci când i se oferă o pereche specifică de elemente a și b ca cele două argumente ale sale. Dacă sunt returnate rezultate inconsecvente, atunci ordinea de sortare este nedefinită.

Deci, funcția de comparare are următoarele formă:

Funcția compare(a, b) ( dacă (a este mai mică decât b după un criteriu de ordonare) ( returnează -1; ) dacă (a este mai mare decât b după criteriul de ordonare) ( returnează 1; ) // a trebuie să fie egal cu b returnează 0;

Pentru a compara numere în loc de șiruri, funcția de comparare poate scădea pur și simplu b din a . Următoarea funcție va sorta matricea crescător (dacă nu conține Infinity și NaN):

Funcția compareNumbers(a, b) ( return a - b; ) var numere = ; numere.sortare(funcție(a, b) ( returnează a - b; )); console.log(numere); //

ES2015 oferă expresii cu funcția săgeată cu o sintaxă și mai scurtă.

Fie numere = ; numere.sortare((a, b) => a - b); console.log(numere); //

Obiectele pot fi sortate având în vedere valoarea uneia dintre proprietățile lor.

Elemente variabile = [ ( nume: „Edward”, valoare: 21 ), ( nume: „Sharpe”, valoare: 37 ), ( nume: „Și”, valoare: 45 ), ( nume: „The”, valoare: - 12 ), ( nume: „Magnetic”, valoare: 13 ), ( nume: „Zero”, valoare: 37 ) ]; // sortează după valoare itemi.sort(funcția (a, b) ( returnează a.valoare - b.valoare; )); // sortează după nume items.sort(function(a, b) ( var nameA = a.name.toUpperCase(); // ignoră majuscule și minuscule var nameB = b.name.toUpperCase(); // ignoră majuscule și minuscule dacă (numeA< nameB) { return -1; } if (nameA >numeB) ( return 1; ) // numele trebuie să fie egale return 0; ));

Exemple Crearea, afișarea și sortarea unei matrice

Următorul exemplu creează patru matrice și afișează matricea originală, apoi matricele sortate. Matricele numerice sunt sortate fără, apoi cu o funcție de comparare.

Var stringArray = ["Blue", "Humpback", "Beluga"]; var numericStringArray = ["80", "9", "700"]; var numberArray = ; var mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200]; funcția compareNumbers(a, b) ( return a - b; ) console.log("stringArray:", stringArray.join()); console.log("Sortat:", stringArray.sort()); console.log("numberArray:", numberArray.join()); console.log("Sortat fara functie de comparare:", numberArray.sort()); console.log("Sortat cu compareNumbers:", numberArray.sort(compareNumbers)); console.log("numericStringArray:", numericStringArray.join()); console.log("Sortat fără o funcție de comparare:", numericStringArray.sort()); console.log("Sortat cu compareNumbers:", numericStringArray.sort(compareNumbers)); console.log("mixedNumericArray:", mixedNumericArray.join()); console.log("Sortat fără o funcție de comparare:", mixedNumericArray.sort()); console.log("Sortat cu compareNumbers:", mixedNumericArray.sort(compareNumbers));

Acest exemplu produce următorul rezultat. După cum arată rezultatul, atunci când este utilizată o funcție de comparare, numerele sortează corect, indiferent dacă sunt numere sau șiruri numerice.

StringArray: Blue,Humpback,Beluga Sorted: Beluga,Blue,Humpback numberArray: 40,1,5,200 Sortat fără o funcție de comparare: 1,200,40,5 Sortat cu compareNumbers: 1,5,40,200 numericStringArray: 80,9,700 Sorted fără o comparație funcția: 700,80,9 Sortate cu compareNumbers: 9,80,700 mixedNumericArray: 80,9,700,40,1,5,200 Sortate fără o funcție de comparare: 1,200,40,5,700,80,9 Sortate cu compareNumbers: 1,5,9, 40.80.200.700

Sortarea caracterelor non-ASCII

Pentru sortarea șirurilor cu caractere non-ASCII, de ex. șiruri cu caractere accentuate (e, é, è, a, ä, etc.), șiruri din alte limbi decât engleza: utilizați String.localeCompare . Această funcție poate compara acele caractere astfel încât să apară în ordinea corectă.

Var item = ["reservé", "premier", "cliseu", "communiqué", "café", "adieu"]; items.sort(funcție (a, b) ( return a.localeCompare(b); )); // articolele sunt ["adieu", "café", "cliseu", "communiqué", "premier", "reservé"]

Sortare cu harta

ComparaFunction poate fi invocată de mai multe ori per element din matrice. În funcție de natura funcției de comparare, acest lucru poate genera o suprasolicitare mare. Cu cât o funcție de comparare face mai multă muncă și cu cât sunt mai multe elemente de sortat, cu atât mai înțelept ar fi să luați în considerare utilizarea unei hărți pentru sortare. Ideea este să traversați matricea o dată pentru a extrage valorile reale utilizate pentru sortarea într-o matrice temporară, sortați matricea temporară și apoi traversați matricea temporară pentru a obține ordinea corectă.

// tabloul de sortat var list = ["Delta", "alpha", "CHARLIE", "bravo"]; // matricea temporară deține obiecte cu poziția și valoarea de sortare var mapată = list.map(function(el, i) ( return ( index: i, value: el.toLowerCase() ); )) // sortarea matricei mapate care conține valorile reduse mapate.sort(funcția(a, b) ( dacă (a.valoare > b.valoare) ( ​​întoarce 1; ) dacă (a.valoare)< b.value) { return -1; } return 0; }); // container for the resulting order var result = mapped.map(function(el){ return list; });

Specificații Comentariu privind starea specificațiilor
ECMAScript prima ediție (ECMA-262) Standard Definiție inițială.
ECMAScript 5.1 (ECMA-262)
Standard
ECMAScript 2015 (ediția a 6-a, ECMA-262)
Definiția „Array.prototype.sort” din specificația respectivă.
Standard
Ultima versiune ECMAScript (ECMA-262)
Definiția „Array.prototype.sort” din specificația respectivă.
Proiect
Compatibilitate browser

Tabelul de compatibilitate din această pagină este generat din date structurate. Dacă doriți să contribui la date, vă rugăm să verificați scoateți https://github.com/mdn/browser-compat-data și trimiteți-ne o cerere de extragere.

Actualizați datele de compatibilitate pe GitHub

Desktop Mobile Server Chrome Edge Firefox Internet Explorer Opera Safari Android Webview Chrome pentru Android Edge Mobile Firefox pentru Android Opera pentru Android Safari pe iOS Samsung Internet Node.jsfel
Suport complet Chrome 1Edge Suport complet 12Suport complet pentru Firefox 1IE Suport complet 5.5Opera Suport complet DaSafari Suport complet DaWebView Android Suport complet DaChrome Android Suport complet DaEdge Mobile Suport complet DaFirefox Android Suport complet 4Opera Android Suport complet DaSafari iOS Suport complet DaSamsung Internet Android Suport complet Danodejs Suport complet Da

În mod implicit, metoda sortare sortează matricea în ordine alfabetică reprezentând fiecare valoare a elementului matricei ca șir folosind metoda toString().

De exemplu, sortarea unui tablou format din numere:

Var arrNumbers = new Array(50,4,1,76,20,3,27,5,501); document.write("Matrice sursa:"); document.write("

"); arrNumbers.sort(); document.write("Matrice sortată:"); document.write("

Pentru a sorta matricea așa cum dorim, trebuie să scriem o funcție specială și să transmitem numele acesteia ca parametru metodei de sortare.

Dar înainte de a trece la crearea funcției, să ne uităm la algoritmul prin care metoda de sortare sortează o matrice. De fapt, algoritmul de sortare este foarte simplu și constă în compararea repetată a 2 elemente adiacente dintr-o matrice, care sunt rearanjate (ordonate) în funcție de rezultatul comparației.

Prin urmare, o funcție specială trebuie să aibă 2 parametri. Mai mult, metoda de sortare în sine va transmite valorile acestor parametri, adică. Nu cunoaștem valorile parametrilor. Dar pentru noi acest lucru nu este important, pentru că... sarcina noastră se rezumă la scrierea unui algoritm de comparare a valorilor acestor parametri și de a produce ca rezultat o valoare prin care metoda de sortare va determina dacă să rearanjeze sau nu aceste elemente ale matricei.

Acestea. metoda de sortare determină dacă se rearanjează sau nu elementele în funcție de rezultat, care revine această funcție. Să ne uităm la ce valori ar trebui să returneze funcția:

  • Dacă funcția returnează 0, atunci elementele matricei date sunt egale;
  • Dacă funcția returnează 1 (sau mai mult de 0), atunci aceasta înseamnă că primul element al matricei este mai mare decât al doilea;
  • Dacă funcția returnează -1 (sau mai puțin decât 0), atunci aceasta înseamnă că al doilea element al matricei este mai mare decât primul.

După crearea funcției, aceasta trebuie transmisă ca parametru la metoda de sortare. Mai mult, trebuie doar să treceți numele acestei funcții, fără a o include între ghilimele și fără a specifica paranteze. Toate acestea se explică prin faptul că nu cerem metodei de sortare pentru a apela această funcție chiar acum, ci pur și simplu spunem aceasta metoda, astfel încât să-l folosească exact atunci când compară elemente de matrice, i.e. ca și cum am înlocui funcția sa standard de sortare a unui tablou cu funcția care îi este dată ca parametru.

De exemplu, să scriem o funcție pentru sortarea numerelor:

//Funcție de comparare a numerelor, care returnează: // 0 - numerele sunt egale; // 1 - primul număr este mai mare decât al doilea număr // -1 - al doilea număr este mai mare decât primul număr funcția compareNumbers(n1,n2) ( dacă (n1==n2) returnează 0; dacă (n1>n2) ) return 1; else return -1 ) var arrNumbers = new Array (50,4,1,76,20,3,27,5,501); document.write("Matrice sursa:"); document.write("
"); document.write(arrNumbers.join(", ")); document.write("

"); document.write(arrNumbers.join(", "));

Astfel, folosind o funcție specială, puteți forța metoda de sortare să sorteze matricea conform algoritmului specificat în această funcție.

De exemplu, sortarea unui tablou numeric în ordine inversă:

//Funcție de comparare a numerelor, care returnează: // 0 - numerele sunt egale; // 1 - primul număr este mai mare decât al doilea număr // -1 - al doilea număr este mai mare decât primul număr funcția compareNumbers(n1,n2) ( dacă (n1==n2) returnează 0; dacă (n1)