[JAVA] L'idée du tri rapide

Au début

Puisque la mise en œuvre du tri rapide expliquée sur le net ne s'est pas bien déroulée, je vais mettre en ligne un article que j'ai moi-même résumé. La politique de l'algorithme adopte la décomposition et la réagrégation d'éléments, ce qui est souvent repris dans l'explication des langages fonctionnels, et je vais essayer de l'implémenter en Java et voir à quel point il est difficile d'implémenter le tri rapide dans les langages d'enseignement.

L'idée du tri rapide

À titre d'exemple, envisagez de trier un ensemble de nombres [6,1,8,5,9]. Lors d'un tri rapide, nous avons besoin d'un critère pour diviser les éléments, mais ici nous utiliserons le premier élément de l'ensemble pour ce critère.

Image démontée de la liste

image

Image de liste agrégée après décomposition

image

Code d'implémentation

Qsort.java


package test;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

public class QSort {

	public static void main(String args[]){
		System.out.println(qsort(Arrays.asList(1,5,6,2,11,9,4)));
	}

	public static List<Integer> qsort(List<Integer>list){
		if(list.size()==1){
			//Si le tableau contient un élément, quittez le traitement récursif
			return new ArrayList<Integer>(list) ;
		}else{
			//Appelez le processus pour diviser les éléments dans la liste
			Divive div = splitList(list);
			//Générer une liste pour stocker le tableau fractionné
			List<Integer>newList = new ArrayList<Integer>();
			//Effectuer un traitement récursif pour séparer à nouveau un petit ensemble de nombres
			newList.addAll(qsort(div.leftList));
			//Effectuer un traitement récursif pour isoler à nouveau un grand ensemble
			newList.addAll(qsort(div.rightList));
			return newList ;
		}
	}

	//Fonction pour diviser la liste
	public static Divive splitList(List<Integer>list){
		int size =list.size();
		Divive div = new Divive();
		//Lorsque le nombre d'éléments est de deux, la taille des éléments est comparée et les éléments sont divisés.
		if(size==2){
			if(list.get(0)<=list.get(1)){
				div.leftList.add(list.get(0))  ;
				div.rightList.add(list.get(1))  ;
			}else{
				div.leftList.add(list.get(1))  ;
				div.rightList.add(list.get(0))  ;
			}
			return div;
		}

		int pivot = list.get(0);
		List<Integer>smallIntList =new ArrayList<Integer>();
		List<Integer>largeIntList =new ArrayList<Integer>();
		//Divisez la liste donnée par l'argument en un petit ensemble et un grand ensemble selon un critère prédéterminé.
		for(int i=0;i<size;i++){
			//Générer un ensemble de nombres plus petits que la référence
			if(pivot>=list.get(i))smallIntList.add(list.get(i));
			//Générer un ensemble de nombres plus grands que la référence
			if(pivot<list.get(size - 1- i))largeIntList.add(list.get(size - 1- i));
		}
		
		//Si les arguments de la liste donnée par le petit ensemble ne correspondent pas, renvoyez la combinaison de listes fractionnées à l'appelant.
		if(smallIntList.size()!=list.size()){
			div.leftList.addAll(smallIntList);
			div.rightList.addAll(largeIntList);
		}
		//Si l'argument de la liste donnée par l'argument correspond au petit ensemble, le numéro de référence est le plus petit, donc
		//Divisez la liste à l'extrême gauche de la liste et ailleurs
		else{
			Deque<Integer> que  = new ArrayDeque<Integer>(smallIntList);
			div.leftList.add(que.pop()) ;
			div.rightList.addAll(new ArrayList<Integer>(que))  ;
		}
		return div;
	}
	
	//Java ne peut pas définir une valeur binaire pour la valeur de retour, il est donc nécessaire de définir une structure de données qui représente l'ensemble après la division.
	static public class Divive{
		List<Integer>leftList =new ArrayList<Integer>();
		List<Integer>rightList =new ArrayList<Integer>();
	}
}


Recommended Posts

L'idée du tri rapide
L'idée de jQuery
Le secret du succès d'IntelliJ IDEA
Le monde de Clara-Rules (2)
À propos de l'idée des classes anonymes en Java
Jugement du calendrier
Le monde de Clara-Rules (4)
Le monde de Clara-Rules (1)
Le monde de Clara-Rules (3)
Le monde de Clara-Rules (5)
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé le nouveau profileur de fonctionnalités d'IntelliJ IDEA 2019.2.
À propos de la gestion de Null
Surveillance Docker-expliquant les bases des bases-
À propos de la description de Docker-compose.yml
Le jeu d'instancier java.lang.Void
Valeur médiane de trois valeurs
L'illusion de l'orientation objet
L'idée de couper quand l'erreur n'est pas résolue
L'idée de C # (expression lambda, pour phrase) à mâcher
À propos du comportement de ruby Hash # ==
Suite: La parabole de la POO (omise)
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Modifier seulement une partie du texte
Comprendre le mécanisme de base de log4j2.xml
À propos des bases du développement Android
'% 02d' Quel est le% de% 2?
[Rails] Vérifiez le contenu de l'objet
Remplacez le contenu du fichier Jar
[Édition Java] Histoire de la sérialisation
Vérifiez la version de Cent OS
Explication de l'ordre des itinéraires ferroviaires
J'ai lu la source de ArrayList que j'ai lu
Les bases de SpringBoot + MyBatis + MySQL
Remarque sur le chemin de request.getRequestDispatcher
J'ai lu la source d'Integer
Ceci et cela de JDK
Vérifier l'état de migration des rails
L'histoire de @ViewScoped dévore la mémoire
Filtrer les fluctuations des données brutes
Un mémorandum du problème FizzBuzz
J'ai lu la source de Long
Expliquez la colonne de Spree :: Product
Diverses méthodes de la classe String
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
Obtenez l'ID de la numérotation automatique
J'ai lu la source de Short
J'ai lu la source de Byte
Ordre de traitement dans le programme
J'ai lu la source de String
L'origine des expressions Java lambda