Els algoritmes d'ordenació són fonamentals en la programació i la informàtica. Aquests algoritmes permeten organitzar una col·lecció de dades en un ordre específic, com ara numèric o alfabètic. En aquesta secció, explorarem alguns dels algoritmes d'ordenació més comuns, com el Bubble Sort, el Selection Sort i el Quick Sort.
Objectius d'aprenentatge
Al final d'aquest tema, hauràs de ser capaç de:
- Comprendre el concepte d'ordenació i la seva importància.
- Implementar diversos algoritmes d'ordenació.
- Comparar l'eficiència dels diferents algoritmes d'ordenació.
- Bubble Sort
Descripció
El Bubble Sort és un dels algoritmes d'ordenació més senzills. Funciona comparant parelles d'elements adjacents i intercanviant-los si estan en l'ordre incorrecte. Aquest procés es repeteix fins que la llista està ordenada.
Implementació
def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr # Exemple d'ús arr = [64, 34, 25, 12, 22, 11, 90] print("Array original:", arr) sorted_arr = bubble_sort(arr) print("Array ordenat:", sorted_arr)
Explicació del codi
- Inicialització:
n
és la longitud de l'array. - Bucle extern: Itera sobre cada element de l'array.
- Bucle intern: Compara cada parell d'elements adjacents i els intercanvia si estan en l'ordre incorrecte.
- Intercanvi: Si
arr[j]
és més gran quearr[j+1]
, es fa l'intercanvi.
Complexitat
- Pitjor cas: O(n^2)
- Millor cas: O(n) (quan l'array ja està ordenat)
- Cas mitjà: O(n^2)
- Selection Sort
Descripció
El Selection Sort funciona seleccionant repetidament el mínim (o màxim) element de la part no ordenada de l'array i intercanviant-lo amb el primer element no ordenat.
Implementació
def selection_sort(arr): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr # Exemple d'ús arr = [64, 25, 12, 22, 11] print("Array original:", arr) sorted_arr = selection_sort(arr) print("Array ordenat:", sorted_arr)
Explicació del codi
- Inicialització:
n
és la longitud de l'array. - Bucle extern: Itera sobre cada element de l'array.
- Trobar el mínim: Troba l'índex del mínim element en la part no ordenada de l'array.
- Intercanvi: Intercanvia el mínim element trobat amb el primer element no ordenat.
Complexitat
- Pitjor cas: O(n^2)
- Millor cas: O(n^2)
- Cas mitjà: O(n^2)
- Quick Sort
Descripció
El Quick Sort és un algoritme d'ordenació eficient que utilitza el mètode de divideix i venceràs. Tria un element com a pivot i particiona l'array en dues subarrays, un amb elements menors que el pivot i l'altre amb elements majors. Després, ordena les subarrays recursivament.
Implementació
def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # Exemple d'ús arr = [3, 6, 8, 10, 1, 2, 1] print("Array original:", arr) sorted_arr = quick_sort(arr) print("Array ordenat:", sorted_arr)
Explicació del codi
- Cas base: Si l'array té un o cap element, ja està ordenat.
- Pivot: Tria un element com a pivot (en aquest cas, el del mig).
- Partició: Divideix l'array en tres parts: elements menors que el pivot, elements iguals al pivot i elements majors que el pivot.
- Recursió: Ordena recursivament les subarrays i les combina.
Complexitat
- Pitjor cas: O(n^2) (quan l'array està ja ordenat o en ordre invers)
- Millor cas: O(n log n)
- Cas mitjà: O(n log n)
Comparació dels Algoritmes
Algoritme | Pitjor cas | Millor cas | Cas mitjà | Espai addicional |
---|---|---|---|---|
Bubble Sort | O(n^2) | O(n) | O(n^2) | O(1) |
Selection Sort | O(n^2) | O(n^2) | O(n^2) | O(1) |
Quick Sort | O(n^2) | O(n log n) | O(n log n) | O(log n) |
Exercicis Pràctics
Exercici 1: Implementa el Bubble Sort
Implementa el Bubble Sort per a una llista de nombres donada i comprova el seu funcionament amb diferents conjunts de dades.
Exercici 2: Implementa el Selection Sort
Implementa el Selection Sort per a una llista de nombres donada i comprova el seu funcionament amb diferents conjunts de dades.
Exercici 3: Implementa el Quick Sort
Implementa el Quick Sort per a una llista de nombres donada i comprova el seu funcionament amb diferents conjunts de dades.
Solucions
Solució Exercici 1
def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr
Solució Exercici 2
def selection_sort(arr): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr
Solució Exercici 3
def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right)
Conclusió
En aquesta secció, hem explorat tres dels algoritmes d'ordenació més comuns: Bubble Sort, Selection Sort i Quick Sort. Hem vist com implementar-los i hem comparat la seva eficiència. Aquests coneixements són fonamentals per a qualsevol programador, ja que l'ordenació és una operació bàsica en moltes aplicacions.
Fonaments de la Programació
Mòdul 1: Introducció a la Programació
- Què és la programació?
- Història de la programació
- Llenguatges de programació
- Entorns de desenvolupament