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ó.

  1. 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

  1. Inicialització: n és la longitud de l'array.
  2. Bucle extern: Itera sobre cada element de l'array.
  3. Bucle intern: Compara cada parell d'elements adjacents i els intercanvia si estan en l'ordre incorrecte.
  4. Intercanvi: Si arr[j] és més gran que arr[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)

  1. 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

  1. Inicialització: n és la longitud de l'array.
  2. Bucle extern: Itera sobre cada element de l'array.
  3. Trobar el mínim: Troba l'índex del mínim element en la part no ordenada de l'array.
  4. 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)

  1. 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

  1. Cas base: Si l'array té un o cap element, ja està ordenat.
  2. Pivot: Tria un element com a pivot (en aquest cas, el del mig).
  3. Partició: Divideix l'array en tres parts: elements menors que el pivot, elements iguals al pivot i elements majors que el pivot.
  4. 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.

© Copyright 2024. Tots els drets reservats