Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Czym jest QuickSort? Kiedy i przez kogo został stworzony? Jak dokładnie działa QuickSort?

Ta treść została automatycznie przetłumaczona z ukraińskiego.
QuickSort jest algorytmem sortowania, który wykorzystuje strategię "dziel i rządź". Szybko i efektywnie sortuje tablice poprzez porównywanie elementów i przenoszenie ich na odpowiednie pozycje. 

Kiedy i przez kogo stworzono QuickSort?

QuickSort został opracowany przez brytyjskiego inżyniera i informatyka Tony'ego Hoare'a w 1959 roku. Tony Hoare stał się znany w dziedzinie informatyki dzięki swoim znaczącym wkładom, a QuickSort stał się jednym z jego najbardziej znanych wynalazków. Tony Hoare otrzymał nagrodę Turinga w 1980 roku za swoje prace w dziedzinie sortowania i analizy algorytmów.

Jak dokładnie działa sortowanie QuickSort?

  1. Wybierany jest element pivot (punkt odniesienia). Może to być dowolny element tablicy, na przykład pierwszy, ostatni lub środkowy element.
  2. Ustawiamy elementy tablicy w taki sposób, że wszystkie elementy mniejsze od pivot znajdują się przed nim, a wszystkie większe elementy - za nim. Element pivot trafia na swoją ostateczną pozycję.
  3. Rekurencyjnie stosujemy QuickSort do podtablicy znajdującej się przed elementem pivot (elementy mniejsze) oraz do podtablicy znajdującej się za elementem pivot (elementy większe).
  4. Powtarzamy kroki 1-3 dla każdej podtablicy, aż cała tablica będzie posortowana.
Ponieważ QuickSort stosuje strategię "dziel i rządź", wykazuje dobrą szybkość działania. Średnio jego złożoność wynosi O(n log n), gdzie n to liczba elementów w tablicy. Jednak najgorszy przypadek może mieć złożoność O(n^2), gdy element pivot zawsze wybierany jest jako największy lub najmniejszy element tablicy. Aby uniknąć najgorszego przypadku, można stosować różne strategie wyboru elementu pivot, na przykład losowy wybór lub medianę trzech elementów.

Przykład algorytmu QuickSort (JavaScript).

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  
  const pivot = arr[Math.floor(arr.length / 2)];
  const less = [];
  const greater = [];
  
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      less.push(arr[i]);
    } else if (arr[i] > pivot) {
      greater.push(arr[i]);
    }
  }
  
  return [...quickSort(less), pivot, ...quickSort(greater)];
}

// Przykład użycia:
const array = [5, 3, 1, 6, 2, 4];
const sortedArray = quickSort(array);
console.log(sortedArray);
Funkcja quickSort przyjmuje tablicę arr jako parametr wejściowy i zwraca posortowaną tablicę.
Algorytm QuickSort rekurencyjnie dzieli wejściową tablicę na mniejsze i większe podtablice w odniesieniu do wybranego elementu pivot (pivot). Elementy mniejsze od pivot są przechowywane w less, a większe - w greater. Następnie wywoływana jest rekurencyjna funkcja quickSort dla podtablic less i greater, a wyniki są łączone z elementem pivot pivot, aby utworzyć końcową posortowaną tablicę.
Wynik: 
[1, 2, 3, 4, 5, 6]

Przykład algorytmu QuickSort (Ruby).

def quick_sort(arr)
  return arr if arr.length <= 1

  pivot = arr[arr.length / 2]
  less = []
  greater = []

  arr.each do |element|
    if element < pivot
      less << element
    elsif element > pivot
      greater << element
    end
  end

  return [*quick_sort(less), pivot, *quick_sort(greater)]
end

# Przykład użycia:
array = [5, 3, 1, 6, 2, 4]
sorted_array = quick_sort(array)
puts sorted_array
Tak samo jak w przykładzie z JavaScript - funkcja quick_sort przyjmuje tablicę arr jako parametr wejściowy i zwraca posortowaną tablicę.
Algorytm QuickSort rekurencyjnie dzieli wejściową tablicę na mniejsze i większe podtablice w odniesieniu do wybranego elementu pivot (pivot). Elementy mniejsze od pivot są przechowywane w tablicy less, a większe - w tablicy greater. Następnie rekurencyjnie wywoływana jest quick_sort dla podtablic less i greater, a wyniki są łączone z elementem pivot pivot za pomocą operatora rozpakowania *, aby utworzyć końcową posortowaną tablicę.
Wynik:
[1, 2, 3, 4, 5, 6]
Czy algorytm QuickSort jest używany w standardowych metodach JavaScript lub Ruby?
W standardowych metodach języków Ruby i JavaScript, które odpowiadają za sortowanie, zazwyczaj nie stosuje się dokładnie algorytmu QuickSort. Może to się różnić w zależności od konkretnej implementacji języka i jego wersji, a także od unikalnych wymagań i optymalizacji, które są stosowane.
W Ruby do sortowania tablic domyślnie używany jest algorytm, który łączy metody QuickSort, InsertionSort i HeapSort. Ten algorytm nazywa się Timsort, który został opracowany do optymalnego sortowania różnych typów danych.
W JavaScript sortowanie tablic zazwyczaj wykonuje się za pomocą metody Array.prototype.sort(). Implementacja tej metody może się różnić między różnymi implementacjami JavaScript (na przykład silnikami V8 w Node.js lub Chrome i SpiderMonkey w Firefox). W większości przypadków do sortowania używany jest szybki i zoptymalizowany algorytm, który łączy QuickSort z InsertionSort lub MergeSort, w zależności od implementacji.
Zatem, chociaż QuickSort może być używany jako jeden z komponentów lub podstawowych algorytmów w metodach sortowania tablic Ruby i JavaScript, sam w sobie QuickSort nie jest jedynym algorytmem stosowanym w tych językach do sortowania domyślnie. Zazwyczaj stosowane są bardziej złożone algorytmy, takie jak Timsort lub jego warianty, które łączą różne algorytmy sortowania w celu zapewnienia optymalności i szerokiego zakresu przypadków użycia.

Ten post nie ma jeszcze żadnych dodatków od autora.

26 cze 03:43

Jaka jest różnica między SSD a HDD?

meme code
meme code@memecode
26 cze 03:48

Czym jest NVMe (Non-Volatile Memory Express)? Gdzie stosuje się NVMe?

meme code
meme code@memecode
26 cze 03:52

Co to jest PCIe (Peripheral Component Interconnect Express)?

meme code
meme code@memecode
26 cze 05:44

Czym jest Ubuntu Pro? Jaka jest różnica między Ubuntu a Ubuntu Pro?

meme code
meme code@memecode
26 cze 05:44

Ostatni etap instalacji Ubuntu. Ustawienia po instalacji Ubuntu.

meme code
meme code@memecode
29 cze 13:20

Co to jest ASC i DESC? Jaka jest różnica? Przykłady użycia w SQL, JavaScript i Ruby.

meme code
meme code@memecode
30 cze 10:50

Czym jest rekursja? Przykład rekursji w życiu codziennym. Skutki nieskończonej rekursji.

meme code
meme code@memecode
30 cze 12:08

Czym jest MergeSort? Kiedy i przez kogo został stworzony? Jak dokładnie działa MergeSort?

meme code
meme code@memecode
30 cze 12:15

Jaka jest różnica między QuickSort a MergeSort?

meme code
meme code@memecode
3 lip 05:03

Czym jest MS-DOS? Kiedy i przez kogo stworzono MS-DOS?

meme code
meme code@memecode
3 lip 06:45

Czym jest API (Interfejs Programowania Aplikacji)?

meme code
meme code@memecode
10 lip 05:43

Czym jest dystrybucja?

meme code
meme code@memecode