Tri binaire

Harshit Jindal 12 octobre 2023
  1. Algorithme de tri binaire
  2. Exemple de tri binaire
  3. Implémentation d’algorithme de tri binaire
  4. Complexité de l’algorithme de tri binaire
Tri binaire

Le tri binaire est un algorithme de tri par comparaison de types. Il s’agit d’une modification de l’algorithme de tri par insertion (/fr/tutorial/algorithm/insertion-sort/). Dans cet algorithme, nous maintenons également un sous-tableau trié et un sous-tableau non trié. La seule différence est que nous trouvons la position correcte d’un élément en utilisant la recherche binaire au lieu de la recherche linéaire. Cela permet de fixer l’algorithme de tri en réduisant le nombre de comparaisons nécessaires.

Algorithme de tri binaire

Supposons que nous ayons un tableau non trié A[] contenant n éléments. Le premier élément, A[0], est déjà trié et se trouve dans le sous-tableau trié.

  • Marquez le premier élément du sous-tableau non trié A[1] comme étant la clé.
  • Utilisez la recherche binaire pour trouver la position correcte p de A[1] dans le sous-tableau trié.
  • Déplacez les éléments de p 1 vers la droite et insérez A[1] dans sa position correcte.
  • Répétez les étapes ci-dessus pour tous les éléments du sous-réseau non trié.

Exemple de tri binaire

Supposons que nous ayons le tableau : (5,3,4,2,1,6). Nous allons le trier en utilisant l’algorithme de tri par insertion.

Sous-tableau trié Sous-réseau non trié Array
( 5 ) ( 3, 4, 2, 1, 6) (5, 3, 4, 2, 1, 6)
  • Premier tour

Clé : A[1] = 3

Recherche binaire : renvoie la position de 3 comme index 0. Décalage à droite du reste des éléments dans le tableau trié.

Sous-tableau trié Sous-réseau non trié Array
( 3 , 5) (4, 2, 1, 6) (3, 5, 4, 2, 1, 6)
  • Deuxième tour

Clé : A[2] = 4

Recherche binaire : renvoie la position de 4 comme index 1. Décalage à droite du reste des éléments dans le tableau trié.

Sous-tableau trié Sous-réseau non trié Array
( 3, 4, 5) (2, 1, 6) (3, 4, 5, 2, 1,6)
  • Troisième tour

Clé : A[3] = 2

Recherche binaire : renvoie la position de 2 comme index 0. Décalage à droite du reste des éléments dans le tableau trié.

Sous-tableau trié Sous-réseau non trié Array
( 2, 3, 4, 5) (1, 6) (2, 3, 4, 5, 1,6)
  • Quatrième tour

Clé : A[4] = 1

Recherche binaire : renvoie la position de 1 comme index 0. Décalage à droite du reste des éléments dans le tableau trié.

Sous-tableau trié Sous-réseau non trié Array
( 1, 2, 3, 4, 5) (6) (1, 2, 3, 4, 5, 6)
  • Cinquième tour

Clé : A[5] = 6

Recherche binaire : renvoie la position de 6 comme index 5. Il n’y a pas d’éléments sur la droite.

Sous-réseau trié Sous-réseau non trié Array
( 1, 2, 3, 4, 5, 6) () (1, 2, 3, 4, 5, 6)

Nous obtenons le tableau trié après la quatrième itération - (1 2 3 4 5 6).

Implémentation d’algorithme de tri binaire

#include <bits/stdc++.h>
using namespace std;

int binarySearch(int a[], int x, int low, int high) {
  if (high <= low) return (x > a[low]) ? (low + 1) : low;

  int mid = (low + high) / 2;

  if (x == a[mid]) return mid + 1;

  if (x > a[mid]) return binarySearch(a, x, mid + 1, high);
  return binarySearch(a, x, low, mid - 1);
}

void binarySort(int a[], int n) {
  for (int i = 1; i < n; ++i) {
    int j = i - 1;
    int key = a[i];
    int pos = binarySearch(a, key, 0, j);
    while (j >= pos) {
      a[j + 1] = a[j];
      j--;
    }
    a[j + 1] = key;
  }
}

int main() {
  int n = 6;
  int arr[6] = {5, 3, 4, 2, 1, 6};
  cout << "Input arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  binarySort(arr, n);  // Sort elements in ascending order
  cout << "Output arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Complexité de l’algorithme de tri binaire

Complexité temporelle

  • Cas moyen

La recherche binaire a une complexité logarithmique logn par rapport à la complexité linéaire n de la recherche linéaire utilisée dans le tri par insertion. Nous utilisons le tri binaire pour les éléments n, ce qui nous donne la complexité temporelle nlogn. Ainsi, la complexité temporelle est de l’ordre de [Big Theta] : O(nlogn).

  • Pire cas

Le cas le plus défavorable se produit lorsque le tableau est trié à l’envers, et que le nombre maximum d’équipes est nécessaire. La complexité temporelle du pire cas est [Big O] : O(nlogn).

  • Meilleur cas

Dans le meilleur des cas, le tableau est déjà trié et aucun déplacement d’éléments n’est nécessaire. Le meilleur cas de complexité temporelle est [Big Omega] : O(n).

Complexité spatiale

La complexité spatiale de l’algorithme de tri binaire est O(n) car aucune mémoire supplémentaire autre qu’une variable temporaire n’est nécessaire.

Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

Article connexe - Sort Algorithm