Table des matières
1. Tri par insertion directe
1. Tri par insertion illustré
2. 代码实现
3.性能检测与时空复杂度
二、希尔排序(交换法)
1. 思路图解
3. 时间复杂度
4. 关于增量的选择
3 Tests de performances et complexité spatio-temporelle
L'insertion directe et le tri des enregistrements sont moindres, les mots-clés L'efficacité est plus élevée lorsqu'elle est essentiellement ordonnée
rrreee
Maison Java javaDidacticiel Comment trier 100 millions de nombres aléatoires en Java ?

Comment trier 100 millions de nombres aléatoires en Java ?

May 09, 2023 pm 05:31 PM
java

1. Tri par insertion directe

1. Tri par insertion illustré

Idée : Littéralement, l'insertion consiste à placer un élément dans un ensemble spécifique selon une certaine règle, nous devons donc diviser la séquence en deux parties, une partie. est un ensemble ordonné, et l'autre partie est l'ensemble à trier

Illustration :

Comment trier 100 millions de nombres aléatoires en Java ?

Afin de faciliter la compréhension, nous prendrons comme exemple la séquence 4321 la plus spéciale.

D'après ce qui précède idées, nous devons convertir la séquence divisée en deux parties, pour la commodité du codage, nous supposons que le premier élément est un ensemble ordonné, alors notre boucle devrait commencer à partir du 2ème élément , qui est 3

pour éviter l'écrasement 3 dans les opérations suivantes, nous choisissons une variable temporaire pour enregistrer 3. C'est ce qui précède val=arr[1] ,val=arr[1] ,

由于是对数组继进行操作 , 我们同时也需要获取有序集合的最后一个元素的索引作为游标

当游标不越界 , 且待插入的值小于游标指示位置时(上图的4) , 我们将元素4后移 , 游标前移,继续检查集合中的其它元素是否也小于待插入的元素, 直到游标越界

上图由于集合内只有一个4, 游标前移越界了, 因此循环终止. 下一轮比较开始执行

2. 代码实现

public static void insertSort(int[]arr){
        for(int i = 1 ; i < arr.length; i++){
            int val = arr[i];
            int valIndex = i - 1; //游标
            while(valIndex >= 0 && val < arr[valIndex]){ //插入的值比游标指示的值小
                arr[valIndex + 1] = arr[valIndex];
                valIndex--; //游标前移
            }
            arr[valIndex+1] = val;
        }
    }
1234567891011
Copier après la connexion

3.性能检测与时空复杂度

实际运行80w个数据耗时1分4秒(非准确值,每台机器可能都不一样)

Comment trier 100 millions de nombres aléatoires en Java ?

直接插排在排序记录较少, 关键字基本有序的情况下效率较高

时间复杂度 :

关键字比较次数 : KCN=(n^2)/2 总移动次数 : RMN= (n^2)/2

因此时间复杂度约为 O(N^2)

二、希尔排序(交换法)

1. 思路图解

Comment trier 100 millions de nombres aléatoires en Java ?

2. 代码实现

public static void shellSort(int[] arr){ //交换法
        int tmp = 0;
        for(int gap = arr.length / 2 ; gap > 0 ; gap /= 2){
            for(int i = gap ; i < arr.length ; i++){ //先遍历所有数组
                for(int j  = i - gap ; j >= 0 ; j -= gap){//开启插入排序
                    if(arr[ j ] > arr[ gap + j ]){ //可以根据升降序修改大于或小于
                        tmp = arr[gap + j];
                        arr[j+gap] = arr[j];
                        arr[j] = tmp;
                    }
                }
            }
            System.out.println(gap);
            System.out.println(Arrays.toString(arr));
        }
    }
12345678910111213141516
Copier après la connexion

这里最难理解的应该是第三个for循环,j = i - gap, 表示小组内的第一个元素,即j=0,

当小组内的第一个元素大于第二个元素时(由于是逻辑上的分类,第二个元素的索引应当是第一个元素的所有值+增量gap) , 交换两者,反之j-=gap,继续比较或跳出循环 ,

如此往复将所有小组都遍历完之后 , 缩小增量(即gap/=2) , 然后继续上述步骤, 直到增量gap为1时, 序列排序结束

3. 时间复杂度

希尔排序的时间复杂度取决于增量序列的函数 , 需要具体问题具体分析,并不是一个确定的值,这也是第四点需要讨论的问题

4. 关于增量的选择

上述我们在做排序的时候增量缩减选用的时gap/=2的模型, 这并不是最优的选择 , 关于增量的选取 , 属于数学界尚未解决的一个问题

但是可以确定的是, 通过大量的实验证明 ,当n->无穷大

Puisque nous opérons sur le tableau, nous devons également obtenir le

ordered set L'index du dernier élément est utilisé comme curseur Comment trier 100 millions de nombres aléatoires en Java ?

Lorsque le curseur ne franchit pas la limite et que la valeur à insérer est inférieure à la position indiquée par le curseur (4<3</code > dans l'image ci-dessus), on recule l'élément 4, Le curseur avance et continue de vérifier si les autres éléments de l'ensemble sont plus petits que l'élément à insérer jusqu'à ce que le curseur franchisse la limite dans l'image ci-dessus, puisqu'il y en a. un seul 4 dans l'ensemble, le curseur avance et franchit la limite, donc la boucle se termine<strong> </strong>2 Implémentation du code</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>public static void shellSort02(int[] arr){ //移位法 for(int gap = arr.length/2 ; gap &gt; 0 ; gap /= 2){ //分组 for(int i = gap ; i &lt; arr.length ; i++){ //遍历 int valIndex = i; int val = arr[valIndex]; if(val &lt; arr[valIndex-gap]){ //插入的值小于组内另一个值 while(valIndex - gap &gt;=0 &amp;&amp; val &lt; arr[valIndex-gap]){ //开始插排 // 插入 arr[valIndex] = arr[valIndex-gap]; valIndex -= gap; //让valIndex = valIndex-gap (游标前移) } } arr[valIndex] = val; } } } 12345678910111213141516</pre><div class="contentsignin">Copier après la connexion</div></div><h3 id="Tests-de-performances-et-complexité-spatio-temporelle">3 Tests de performances et complexité spatio-temporelle</h3> <p>Cela prend en fait. 1 minute et 4 secondes pour exécuter 800 000 données (valeur non précise, chaque machine peut être différente)<strong></strong><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/887/227/168362467356567.png" class="lazy" alt="Comment trier 100 millions de nombres aléatoires en Java"></p> <h4 id="L-insertion-directe-et-le-tri-des-enregistrements-sont-moindres-les-mots-clés-L-efficacité-est-plus-élevée-lorsqu-elle-est-essentiellement-ordonnée">L'insertion directe et le tri des enregistrements sont moindres, les mots-clés L'efficacité est plus élevée lorsqu'elle est essentiellement ordonnée</h4> <p><strong>Complexité temporelle :</strong><strong></strong>Nombre de comparaisons de mots clés : <code>KCN=(n^2)/2 Nombre total de mouvements : RMN= ( n^2)/2

La complexité temporelle est donc d'environ O(N^2)2. Tri en colline (méthode d'échange)

1. Illustration des idéesComment trier 100 millions de nombres aléatoires en Java ?

Comment organiser 100 millions de nombres aléatoires en Java

2. Implémentation du code

rrreee

La chose la plus difficile à comprendre ici est probablement la troisième boucle for, j = i - gap, qui représente le premier élément du groupe, c'est-à-dire j=0,

Comment trier 100 millions de nombres aléatoires en Java ?Lorsque le premier élément du groupe est supérieur au deuxième élément (
En raison de la classification logique, l'index du deuxième élément doit être toutes les valeurs du premier élément + l'écart incrémentielComment trier 100 millions de nombres aléatoires en Java ?), échangez les deux, Sinon j-=gap, continuez pour comparer ou sortir de la boucle,
Comment trier 100 millions de nombres aléatoires en Java ?Après avoir parcouru tous les groupes de cette manière, réduisez l'incrément (c'est-à-dire gap/=2), puis continuez les étapes ci-dessus jusqu'à ce que l'écart incrémentiel soit de 1 , et le tri séquentiel se termine

🎜3. Complexité temporelle🎜🎜La complexité temporelle du tri Hill dépend de🎜la fonction de la séquence incrémentielle🎜, qui nécessite une analyse spécifique de problèmes spécifiques et n'est pas la même valeur déterminée, c'est aussi la quatrième point qui doit être discuté🎜🎜4. Concernant le choix de l'incrément🎜🎜Lorsque nous avons fait le tri ci-dessus🎜réduction incrémentale🎜lorsque nous avons choisi le modèle gap/=2, ce n'est pas le choix optimal. . La sélection des incréments est un problème non résolu dans la communauté mathématique🎜🎜Mais ce qui est sûr c'est qu'à travers un grand nombre d'expériences, il a été prouvé que lorsque n->infini code>, la complexité temporelle peut se réduire à : 🎜🎜🎜🎜🎜Dans le point suivant, 🎜méthode shift🎜, nous avons également fait plusieurs expériences, et nous pouvons être sûrs que pour une certaine échelle (comme 800w~100 millions) En termes de calcul, 🎜Le tri Hill est beaucoup plus rapide que le tri par tas🎜, du moins sur mon ordinateur 🎜🎜3. Tri Hill (méthode Shift)🎜🎜La méthode d'échange est beaucoup plus lente que la méthode Shift, donc la 🎜méthode Shift🎜 est plus couramment utilisée. , et la méthode de décalage ressemble plus au tri par insertion 🎜🎜1. L'idée 🎜🎜L'idée est en fait une combinaison des deux méthodes de tri ci-dessus, regroupant 🎜 en groupes🎜 Combinée aux avantages de 🎜insertion🎜, l'efficacité est very high🎜🎜 incarne l'idée de 🎜diviser pour régner🎜, découpant une séquence plus grande en plusieurs séquences plus petites🎜🎜🎜🎜🎜2 Implémentation du code🎜rrreee🎜3.

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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

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