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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

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)

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

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

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

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

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

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

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

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

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

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles