Maison Java javaDidacticiel algorithme de tri de structure de données Java (2) tri par fusion

algorithme de tri de structure de données Java (2) tri par fusion

May 31, 2017 am 09:29 AM
java 归并排序 数据结构 算法

Cet article présente principalement le tri par fusion de l'algorithme de tri des structures de données Java. Il analyse en détail les principes, les techniques de mise en œuvre et les précautions associées du tri par fusion sur la base d'exemples spécifiques. Les amis dans le besoin peuvent se référer à cet article

L'exemple décrit le tri par fusion de l'algorithme de tri des structures de données Java. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Les types de tri mentionnés ci-dessus organisent tous un groupe d'enregistrements dans une séquence ordonnée en fonction de la taille des mots-clés et de l'idée de le tri par fusion est : basé sur la fusion, fusionne deux ou plusieurs listes ordonnées dans une nouvelle liste ordonnée

Algorithme de tri par fusion : Supposons que la séquence initiale contient n enregistrements, Tout d'abord, traitez ces n enregistrements comme n sous-séquences ordonnées, chaque sous-séquence a une longueur de 1, puis fusionnez-les par paires pour obtenir n/2 longueurs de 2 (lorsque n est un nombre impair, la longueur de la dernière séquence est 1 ) sous-séquence ordonnée. Sur cette base, les sous-séquences ordonnées de longueur 2 sont fusionnées brillamment pour obtenir plusieurs sous-séquences ordonnées de longueur 4. Répétez cette opération jusqu'à ce qu'une séquence ordonnée de longueur n soit obtenue. Cette méthode est appelée : tri par fusion bidirectionnel (l'opération de base consiste à fusionner deux sous-séquences ordonnées adjacentes dans la séquence à trier en une séquence ordonnée).

Le code d'implémentation de l'algorithme est le suivant :

package exp_sort;
public class MergeSort {
  /**
   * 相邻两个有序子序列的合并算法
   *
   * @param src_array
   * @param low
   * @param high
   * @param des_array
   */
  public static void Merge(int src_array[], int low, int high,
      int des_array[]) {
    int mid;
    int i, j, k;
    mid = (low + high) / 2;
    i = low;
    k = 0;
    j = mid + 1;
    // compare two list
    while (i <= mid && j <= high) {
      if (src_array[i] <= src_array[j]) {
        des_array[k] = src_array[i];
        i = i + 1;
      } else {
        des_array[k] = src_array[j];
        j = j + 1;
      }
      k = k + 1;
    }
    // if 1 have,cat
    while (i <= mid) {
      des_array[k] = src_array[i];
      k = k + 1;
      i = i + 1;
    }
    while (j <= high) {
      des_array[k] = src_array[j];
      k = k + 1;
      j = j + 1;
    }
    for (i = 0; i < k; i++) {
      src_array[low + i] = des_array[i];
    }
  }
  /**
   * 2-路归并排序算法,递归实现
   *
   * @param src_array
   * @param low
   * @param high
   * @param des_array
   */
  public static void mergeSort(int src_array[], int low, int high,
      int des_array[]) {
    int mid;
    if (low < high) {
      mid = (low + high) / 2;
      mergeSort(src_array, low, mid, des_array);
      mergeSort(src_array, mid + 1, high, des_array);
      Merge(src_array, low, high, des_array);
    }
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    int array1[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
    int array2[] = new int[array1.length];
    mergeSort(array1, 0, array1.length - 1, array2);
    System.out.println("\n----------after sort-------------");
    for (int ii = 0; ii < array1.length; ii++) {
      System.out.print(array1[ii] + " ");
    }
    System.out.println("\n");
  }
}
Copier après la connexion

Explication du code :

Dans le tri par fusion, une passe de fusion nécessite plusieurs appels à l'algorithme de fusion bidirectionnelle. La complexité temporelle d'une passe de fusion est O(n). Parce qu'au plus n-1 comparaisons sont effectuées, où n est le nombre total d'éléments. S'il y a plusieurs nombres, c'est-à-dire lorsque n n'est pas 1, fusionnez et triez de manière récursive la première moitié des données et la seconde moitié des données pour obtenir les deux parties des données triées, puis fusionnez-les ensemble.

Analyse d'algorithme :

Cet algorithme est basé sur l'opération de fusion (également appelée algorithme de fusion, qui fait référence au processus de combinaison de deux séquences triées Un algorithme de tri efficace basé sur l'opération de fusion dans une séquence). Cet algorithme est une application très typique de la

méthode diviser et conquérir (pide and Conquer). Il divise le problème en quelques petits problèmes puis les résout de manière récursive, et l'étape de conquête est résolue en divisant l'étape divisée. Chaque réponse s'emboîte ; diviser pour régner est une utilisation très puissante de la récursivité. Remarque : Par rapport au tri rapide et au tri par tas, la plus grande caractéristique du tri par fusion est qu'il s'agit d'une méthode de tri stable . La vitesse est juste derrière le tri rapide, et elle est généralement utilisée pour les tableaux généralement désordonnés mais dont les sous-éléments sont relativement ordonnés.

Complexité :

La complexité temporelle est :

O(nlogn) - Cet algorithme est le meilleur et le plus efficace. Mauvais et la performance temporelle moyenne. La complexité spatiale est :
O(n)Le nombre d'opérations de comparaison est compris entre (nlogn) / 2 et nlogn - n + 1.
Le nombre d'opérations d'affectation est de (2nlogn). La complexité spatiale de l'algorithme de fusion est : 0 (n)
Il est difficile à utiliser pour le tri de la mémoire principale (le tri par fusion prend plus de mémoire. Le problème principal est que la fusion de deux tables triées nécessite une mémoire supplémentaire linéaire, ce qui coûte également de l'argent dans tout l'algorithme. Certaines opérations supplémentaires telles que copier des données dans un
tableau temporaire puis les recopier ralentiront sérieusement le tri) mais elles sont très efficaces et sont principalement utilisées pour le tri externe et pour des tâches importantes. les applications de tri internes, choisissent généralement le tri rapide.

Les étapes de l'opération de fusion sont les suivantes :

Étape 1 : Demander de l'espace pour que sa taille soit la somme des deux séquences triées. L'espace est utilisé pour stocker la séquence fusionnée

Étape 2 : Définir deux pointeurs, les positions initiales sont les positions de départ des deux séquences triées
Étape 3 : Comparez les éléments pointés par les deux pointeurs, Sélectionnez un élément relativement petit et placez-le dans l'espace de fusion, puis déplacez le pointeur vers la position suivante
Répétez l'étape 3 jusqu'à ce qu'un certain pointeur atteigne la fin de la séquence
Copiez directement tous les éléments restants de l'autre séquence jusqu'à la fin de la séquence de fusion

Les étapes du tri par fusion sont les suivantes (en supposant que la séquence comporte n éléments au total) :

Fusionner tous les deux nombres adjacents dans la séquence (merge), formant des séquences floor(n/2), chaque séquence contient deux éléments après le tri

Fusionner à nouveau les séquences ci-dessus, formant des séquences floor(n/4), chaque séquence en contient quatre éléments
Répétez l'étape 2 jusqu'à ce que tous les éléments soient triés

[Recommandations associées]

1

Algorithme de tri de structure de données Java (1) Tri par sélection d'arbre.

2.

Tutoriel détaillé sur Selection Sort_java en Java

3

Algorithme de tri de structure de données Java (3) Tri par sélection simple.

4. algorithme de tri de structure de données Java (4) tri par sélection

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Racine carrée en Java

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Nombre parfait en Java

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Générateur de nombres aléatoires en Java

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Numéro Armstrong en Java

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Weka en Java

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Questions d'entretien chez Java Spring

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Numéro de Smith en Java

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Break or Return of Java 8 Stream Forach?

See all articles