Maison Java javaDidacticiel algorithme de tri de structure de données Java (1) tri par sélection d'arbre

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

May 31, 2017 am 09:27 AM
java 数据结构

Cet article présente principalement l'arbre d'algorithme de tri de structure de données Java tri par sélection . Il analyse les principes, les techniques de mise en œuvre et les précautions associées au tri par sélection d'arbre Java sur la base d'exemples spécifiques auxquels vous pouvez vous référer. ce qui suit

Cet article décrit le tri par sélection d'arborescence de l'algorithme de tri de structure de données Java à titre d'exemple. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Ici, nous parlerons du tri de l'un des types de sélection : tri par sélection d'arbre

Dans le tri par sélection simple, chaque comparaison Les résultats de la dernière comparaison ne sont pas utilisés, donc la complexité temporelle de l'opération de comparaison est O(N^2) Si vous souhaitez réduire le nombre de comparaisons, vous devez enregistrer la relation de taille pendant. le processus de comparaison. Le tri par sélection arborescente est une amélioration par rapport au tri par sélection simple.

Tri par sélection d'arbre : , également connu sous le nom de Tournoi Tri) , est un tri basé sur le championnat Pensez de façons d'effectuer un tri de sélection. Effectuez d'abord une comparaison par paire des mots-clés de n enregistrements, puis effectuez une comparaison par paire entre les n/2 plus petits, et répétez cette opération jusqu'à ce que le plus petit enregistrement soit sélectionné.

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

package exp_sort;
public class TreeSelectSort {
 public static int[] TreeSelectionSort(int[] mData) {
  int TreeLong = mData.length * 4;
  int MinValue = -10000;
  int[] tree = new int[TreeLong]; // 树的大小
  int baseSize;
  int i;
  int n = mData.length;
  int max;
  int maxIndex;
  int treeSize;
  baseSize = 1;
  while (baseSize < n) {
   baseSize *= 2;
  }
  treeSize = baseSize * 2 - 1;
  for (i = 0; i < n; i++) {
   tree[treeSize - i] = mData[i];
  }
  for (; i < baseSize; i++) {
   tree[treeSize - i] = MinValue;
  }
  // 构造一棵树
  for (i = treeSize; i > 1; i -= 2) {
   tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]);
  }
  n -= 1;
  while (n != -1) {
   max = tree[1];
   mData[n--] = max;
   maxIndex = treeSize;
   while (tree[maxIndex] != max) {
    maxIndex--;
   }
   tree[maxIndex] = MinValue;
   while (maxIndex > 1) {
    if (maxIndex % 2 == 0) {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex]
       : tree[maxIndex + 1]);
    } else {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? tree[maxIndex]
       : tree[maxIndex - 1]);
    }
    maxIndex /= 2;
   }
  }
  return mData;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
  TreeSelectionSort(array);
  for (int i = 0; i < array.length; i++) {
   System.out.print(array[i] + " ");
  }
  System.out.println("\n");
 }
}
Copier après la connexion

Analyse de l'algorithme :

Dans le tri par sélection d'arbre, à l'exception du plus petit mot-clé, le plus petit mot-clé sélectionné passe tous par un processus de comparaison des nœuds feuilles aux nœuds suivants puisqu'un arbre binaire complet contenant n nœuds feuilles a La profondeur est log2n+1. .Par conséquent, dans le tri par sélection arborescente, chaque fois qu'un mot-clé plus petit est sélectionné, des comparaisons log2n sont nécessaires, donc la complexité temporelle est de O(nlog2n). Le nombre d'enregistrements déplacés ne dépasse pas le nombre de comparaisons, donc l'algorithme total Le temps. la complexité est O(nlog2n). Par rapport à l'algorithme de tri par sélection simple, le nombre de comparaisons est réduit d'un ordre de grandeur et n-1 espace de stockage supplémentaire est ajouté pour stocker les résultats de comparaison intermédiaire.

Supplément :

Nous introduisons ici un algorithme amélioré pour le tri par sélection d'arbres, à savoir l'algorithme de tri par tas.

Le tri par tas compense le défaut de l'algorithme de tri par sélection arborescente qui prend beaucoup de place. Lors de l'utilisation du tri par tas, un seul espace auxiliaire de la taille d'un enregistrement est requis.

L'idée de l'algorithme est :

Stocker les mots-clés des enregistrements à trier dans le tableaur[1.. .n], et set r Il est considéré comme une représentation séquentielle d'un arbre binaire complet. Chaque nœud représente un enregistrement. Le premier enregistrement r[1] est utilisé comme racine de l'arbre binaire suivant. 2...n] est superposé de gauche à droite. Disposé dans l'ordre de droite, l'enfant gauche de tout nœud r[i] est r[2*i], l'enfant droit est r[2*i+1] ; le parent est r[[i/2]].

Définition du tas : La valeur clé de chaque nœud satisfait aux conditions suivantes :

r[i].key >= r[2i].key et r[ i].key >= r[2i+1].key (i=1,2,...[i/2])

Un arbre binaire complet qui remplit les conditions ci-dessus est appelé un grand tas racine; au contraire, si La clé de n'importe quel nœud dans cet arbre binaire complet est inférieure ou égale à la clé de son enfant gauche et de son enfant droit, et le tas correspondant est appelé un petit tas racine.

Le processus de tri des tas doit principalement résoudre deux problèmes : le premier consiste à construire un tas initial selon la définition du tas ; le second consiste à reconstruire le tas après avoir supprimé le plus grand élément pour obtenir le sous-plus grand. élément.

Le tri par tas consiste à utiliser les caractéristiques du tas pour trier la séquence d'enregistrements. Le processus est le suivant :

1 Construisez un tas pour la séquence donnée
2. le haut du tas ; (premier élément Échange avec l'élément de queue)
3. Reconstruisez le tas avec les éléments restants ; (filtrez le premier élément)
4. Répétez les étapes 2 et 3 jusqu'à ce que tous les éléments soient affichés.

Remarque : Le "Filtrage" doit commencer à partir du [n/2]ème nœud et remonter couche par couche jusqu'au nœud racine.

Analyse d'algorithme :

1 Pour un tas d'une profondeur de k, le nombre de comparaisons de mots clés requis pour le « filtrage » est d'au plus 2(k-1. ) ;
2. La profondeur du tas de n mots-clés est [log2n]+1, et le nombre de comparaisons de mots-clés requis pour construire initialement le tas est au maximum : n* [log2n];
3. n- 1 fois, le nombre de comparaisons de mots clés requises ne dépasse pas : (n-1)*2 [log2n]

Par conséquent, dans le pire des cas, la complexité temporelle du tri par tas est O(nlog2n ) , c'est le plus grand avantage du tri par tas.

[Recommandations associées]

1. Tutoriel détaillé sur le tri par sélection (Selection Sort_java) en Java

2 Tri de la structure des données Java. algorithme (2) Tri par fusion

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

4. (4) Tri de 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)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines 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.

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

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

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.

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