Introducció
L'ordenació ràpida, coneguda com a Quick Sort, és un algorisme d'ordenació eficient que utilitza la tècnica de "divideix i venceràs". És àmpliament utilitzat gràcies a la seva eficiència en la pràctica i la seva facilitat d'implementació.
Conceptes Clau
- Pivoteig: Seleccionar un element de la llista com a pivot.
- Partició: Reorganitzar els elements de manera que tots els elements menors que el pivot es col·loquin abans d'ell i tots els elements majors es col·loquin després.
- Recursivitat: Aplicar l'algorisme recursivament a les subllistes de menors i majors.
Algorisme
Pseudocodi
QUICKSORT(A, low, high) if low < high pivot_index = PARTITION(A, low, high) QUICKSORT(A, low, pivot_index - 1) QUICKSORT(A, pivot_index + 1, high) PARTITION(A, low, high) pivot = A[high] i = low - 1 for j = low to high - 1 if A[j] <= pivot i = i + 1 swap A[i] with A[j] swap A[i + 1] with A[high] return i + 1
Explicació del Pseudocodi
-
QUICKSORT(A, low, high):
- Si
low
és menor quehigh
, es procedeix amb la partició. - Es crida la funció
PARTITION
per obtenir l'índex del pivot. - Es crida recursivament
QUICKSORT
per a les subllistes abans i després del pivot.
- Si
-
PARTITION(A, low, high):
- Es selecciona el pivot com l'últim element de la llista.
- Es mouen els elements menors que el pivot a l'esquerra i els majors a la dreta.
- Es col·loca el pivot en la seva posició correcta i es retorna el seu índex.
Exemple Pràctic
Codi en Python
def quicksort(arr, low, high): if low < high: pivot_index = partition(arr, low, high) quicksort(arr, low, pivot_index - 1) quicksort(arr, pivot_index + 1, high) def partition(arr, low, high): pivot = arr[high] i = low - 1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 # Exemple d'ús arr = [10, 7, 8, 9, 1, 5] n = len(arr) quicksort(arr, 0, n - 1) print("Array ordenat:", arr)
Explicació del Codi
-
Funció
quicksort
:- Comprova si la subllista té més d'un element (
low < high
). - Obté l'índex del pivot mitjançant
partition
. - Aplica recursivament
quicksort
a les subllistes abans i després del pivot.
- Comprova si la subllista té més d'un element (
-
Funció
partition
:- Selecciona el pivot com l'últim element de la llista.
- Mou els elements menors que el pivot a l'esquerra i els majors a la dreta.
- Col·loca el pivot en la seva posició correcta i retorna el seu índex.
Exercicis Pràctics
Exercici 1
Implementa l'algorisme Quick Sort per a una llista de nombres enters i prova'l amb la següent llista: [3, 6, 8, 10, 1, 2, 1]
.
Solució
Exercici 2
Modifica l'algorisme Quick Sort per seleccionar el pivot com l'element del mig en lloc de l'últim element.
Solució
def quicksort(arr, low, high): if low < high: pivot_index = partition(arr, low, high) quicksort(arr, low, pivot_index - 1) quicksort(arr, pivot_index + 1, high) def partition(arr, low, high): mid = (low + high) // 2 arr[mid], arr[high] = arr[high], arr[mid] pivot = arr[high] i = low - 1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 # Exemple d'ús arr = [10, 7, 8, 9, 1, 5] n = len(arr) quicksort(arr, 0, n - 1) print("Array ordenat:", arr)
Errors Comuns i Consells
- No actualitzar correctament els índexs: Assegura't que els índexs
i
ij
s'actualitzin correctament durant la partició. - Selecció del pivot: La selecció del pivot pot afectar significativament el rendiment. Prova diferents estratègies (primer element, últim element, element del mig, etc.).
- Recursivitat: Assegura't que les crides recursives cobreixin correctament les subllistes abans i després del pivot.
Conclusió
L'ordenació ràpida és un algorisme potent i eficient per a l'ordenació de llistes. Comprendre el seu funcionament i implementació és fonamental per a qualsevol professional de la programació. Practica amb diferents llistes i estratègies de selecció de pivot per dominar aquest algorisme.
Curs d'Anàlisi i Disseny d'Algorismes
Mòdul 1: Introducció als Algorismes
Mòdul 2: Anàlisi d'Algorismes
- Anàlisi de Complexitat Temporal
- Anàlisi de Complexitat Espacial
- Cases de Complexitat: Millor, Pitjor i Promig
Mòdul 3: Estratègies de Disseny d'Algorismes
Mòdul 4: Algorismes Clàssics
- Cerca Binària
- Ordenació per Inserció
- Ordenació per Mescla (Merge Sort)
- Ordenació Ràpida (Quick Sort)
- Algorisme de Dijkstra
- Algorisme de Floyd-Warshall