[JAVA] J'ai essayé de créer un nouvel algorithme de tri, mais je ne sais pas si c'est vraiment nouveau

J'ai fait un nouvel algorithme de tri!

Pour le moment, j'ai mis au point un algorithme de tri. J'ai pensé: "Est-ce que ça ne va pas marcher?", Et quand j'ai écrit un petit flot sur un morceau de papier autour de cette zone, il ne semble y avoir rien d'étrange à ce sujet. Je l'ai implémenté avec la colle de "Alors, voulez-vous l'implémenter! W".

Récemment, faute de matériel, je n'ai introduit que des programmes antérieurs, mais celui-ci en fait partie et il est implémenté en java. Je pense que c'était il y a environ un an.

Le nom de l'algorithme est "Hanoi Sort"

La raison de cette dénomination est que le mouvement pour réaliser le tri en utilisant deux piles était similaire à la résolution d'une tour à Hanoi.

ハノイの塔.png

Ce qui suit montre comment trier par Hanoi Sort.

hanoi.gif

Explication de l'algorithme

Cet algorithme de tri utilise deux piles, une pile de tri et une pile de stockage temporaire. Le flux de tri est illustré ci-dessous.

  1. Remplissez la pile de tri avec une valeur
  2. Remplacez le contenu de la pile de tri par la pile de stockage temporaire.
  3. Stockez la première valeur du tableau d'entrée dans la variable de comparaison
  4. Comparez la valeur de la pile de stockage temporaire avec la valeur au début du tableau et compressez la valeur la plus petite dans la pile de tri.
  5. Continuez jusqu'à ce que la pile de stockage temporaire soit vide
  6. Répétez 2-5

Veuillez me pardonner la mauvaise explication. Je pense que le mouvement de la valeur est facile à comprendre si vous pouvez voir la vidéo gif ci-dessus.

Pour le moment, j'utilise pleinement la pile et je mets des valeurs d'entrée et de sortie tout en interposant des comparaisons. Je ne suis pas très sûr de calculer la quantité de calcul, mais je pense que c'est probablement O (n ^ 2), donc ce n'est pas une excellente sorte. À propos, en comparant le temps de tri de 30000 entiers avec le tri à bulles, le temps de traitement

Tri à Hanoi Tri à bulles
3.997s 1.53s

J'ai fini avec un résultat misérable. Le montant du calcul est-il supérieur à O (n ^ 2)?

Je pense que j'y ai pensé moi-même, mais peut-être que ça existe déjà

Je ne connais même pas tous les algorithmes de tri. Peut-être que vous avez déjà un tri avec le même mécanisme, donc si quelqu'un le sait, faites-le moi savoir!

Enfin laisse tomber le putain de code

hanoi_sort.java


import java.util.*;
import java.io.*;

class hanoi_sort{
    static int[] data;
    public static void main(String[] args) {
        int dataNum = 30000;
        data = new int[30000];
        String[] strarray = new String[30000];
        int k = 0;

        try{
             File file = new File("numbers.txt");
             BufferedReader br = new BufferedReader(new FileReader(file));
             String str= null;
             k = 0;
             while((str = br.readLine()) != null){
                 strarray[k]=str;
                 data[k] = Integer.parseInt(strarray[k]);
                 System.out.println("[" + k + "]" + data[k]);
                 k++;
             }

             br.close();
        }catch(FileNotFoundException e){
              System.out.println(e);
        }catch(IOException e){
              System.out.println(e);
        }

        for(int i = 0; i < dataNum; i++){
            System.out.println("[" + i + "]: " + data[i]);
        }

        System.out.println("--------------sort---------------");

        Deque<Integer> dequeFirst = new ArrayDeque<>();
        Deque<Integer> dequeSecond = new ArrayDeque<>();
        int box = 0;
        int count = 0;
        int countF = 0;
        boolean flag = true;
        dequeFirst.push(data[0]);
        countF++;
        double start = System.currentTimeMillis();
        for(int i = 1; i < dataNum; i++){
            flag = true;
            while(flag){
                box = dequeFirst.pop();
                countF--;
                if(box <= data[i]){
                    dequeFirst.push(box);
                    countF++;
                    dequeFirst.push(data[i]);
                    countF++;
                    for(int j = 0; j < count; j++){
                        dequeFirst.push(dequeSecond.pop());
                        countF++;
                    }
                    count = 0;
                    flag = false;
                }else{
                    dequeSecond.push(box);
                    count ++;
                    if(countF == 0){
                        dequeFirst.push(data[i]);
                        countF++;
                        for(int j = 0; j < count; j++){
                            dequeFirst.push(dequeSecond.pop());
                            countF++;
                        }
                        count = 0;
                        flag = false;
                    }
                }
            }
        }
        double end = System.currentTimeMillis();

        for(int i = 0; i < dataNum; i++){
            System.out.println("[" + i + "]: " + dequeFirst.pop());
        }
        System.out.println("sort time: " + (end - start)  + "ms");
        System.out.println("sort time: " + (end - start)/1000  + "s");
    }
}

À propos, l'entrée est un fichier texte, et la valeur numérique est stockée dans le tableau en lisant celui dans lequel l'entier est écrit un par un sur chaque ligne (partout putain de spécification) Comme ça ↓

6418
18183
13643
6535
8436
3820
8969
19150
11902
4122
.
.
.

Les programmes et les idées d'il y a un an sont embarrassants à regarder en arrière.

Jusqu'à la fin Merci d'avoir lu!

Recommended Posts

J'ai essayé de créer un nouvel algorithme de tri, mais je ne sais pas si c'est vraiment nouveau
11 éléments que je ne sais pas s'il est bon de savoir sur JAVA
C'est nouveau, mais j'ai essayé d'utiliser Groonga
J'ai essayé de créer une fonction de connexion avec Java
J'ai créé un client RESAS-API en Java
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
[Java débutant] J'ai une compréhension un peu plus approfondie de "Il est temps d'utiliser le nouveau", alors prenez note
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
Méthodes de classe Java String qui sont un peu utiles à connaître mais ne savent pas
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
[Android] J'ai créé un écran de liste de matériaux avec ListView + Bottom Sheet
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
J'ai essayé de développer un outil de gestion des effectifs
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
J'ai essayé de développer un site Web pour étudier DUO3.0.
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de créer une application de clonage LINE
J'ai essayé de développer un site Web pour enregistrer les dépenses.
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (version inachevée ②)
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai essayé de développer un site Web de partage de boutique de ramen.
[Rails] Je ne sais pas comment utiliser le modèle ...
J'ai essayé de créer une compétence Clova en Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher