Stackoverflow avec Quicksort implémentation Java
Avoir quelques problèmes de mise en œuvre de quicksort en java. Je reçois un stackoverflow d'erreur quand je lance ce programme et je ne suis pas sûr de savoir exactement pourquoi. Si quelqu'un peut le point sur l'erreur, ce serait formidable.
si est l'indice de départ. l'ie est la fin de l'index.
public static void qsort(int[] a, int si, int ei){
//base case
if(ei<=si || si>=ei){}
else{
int pivot = a[si];
int length = ei - si + 1;
int i = si+1; int tmp;
//partition array
for(int j = si+1; j<length; j++){
if(pivot > a[j]){
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
i++;
}
}
//put pivot in right position
a[si] = a[i-1];
a[i-1] = pivot;
//call qsort on right and left sides of pivot
qsort(a, 0, i-2);
qsort(a, i, a.length-1);
}
}
La ligne qui lance l'exception?
les deux dernières lignes. les deux qui appellent quicksort sur les côtés droit et gauche de pivot.
Le cas de base semble assez standard, si la subarray taille est de 0 ou 1.
Le côté droit et gauche de la condition ou l'air d'être une seule et même chose tho.
Nous montrer la callsite.
les deux dernières lignes. les deux qui appellent quicksort sur les côtés droit et gauche de pivot.
Le cas de base semble assez standard, si la subarray taille est de 0 ou 1.
Le côté droit et gauche de la condition ou l'air d'être une seule et même chose tho.
ei <= si
est logiquement identique à si >= ei
.Nous montrer la callsite.
OriginalL'auteur Shaayaan Sayed | 2013-02-16
Vous devez vous connecter pour publier un commentaire.
D'abord, vous devez fixer les limites de la qsort appel récursif comme suggéré par Keith, car sinon vous êtes toujours trier tout le tableau, encore et encore. Vous devez ajuster votre partition en boucle: j est un indice, en allant du début de la subarray à la fin de celui-ci (y compris le dernier élément). Donc, vous devez effectuer une boucle de si + 1 à l'ie (y compris ie).
Donc, c'est le code corrigé. J'ai couru quelques cas de test et il semble pour le tri de l'amende juste.
OriginalL'auteur raymi
OriginalL'auteur Danial Zafar
Vous pourriez avoir une surabondance de récursivité bug sur vos mains. Pas sûr de mon analyse rapide, mais...
Même si vous ne le faites pas, vous allez encore à l'utilisation beaucoup de pile avec cette mise en œuvre. Suffisamment pour provoquer un débordement de pile. Ce qui se passe si vous l'appelez, avec 1 million d'articles qui sont déjà triés? Vous aurez partition en 1 et les 999 999 éléments, puis, de manière récursive. Donc vous aurez besoin de 1 million de pile d'images pour faire ce travail.
Il ya beaucoup de méthodes pour résoudre ce problème, y compris recursing sur la plus petite des deux plages et de l'itération la plus grande des deux, ou de la mise en œuvre de la pile vous-même dans un tas de discbased, etc. Vous voulez probablement faire encore mieux que ça, même si, comme le deep stack signifie également que vous êtes soufflant du O(n lg n) tri lié.
p.s. le bug est ici:
devrait être
N'est toujours pas résolu: puis-je suggérer que vous exécutez le code, vous suggérez...
alors peut-être ce que j'aurais dit, c'est un "bug", pas le "bug".
Appelez-moi vieux jeu, mais je pense que le point de réponse a été de répondre à la question entièrement?
Mon correctif résout le débordement de la pile pour l'exemple j'ai essayé. Je ne vais pas exhaustive tester son code pour lui de trouver un autre bug qui pourrait être là.
OriginalL'auteur Keith Randall
Vous pouvez essayer ceci:
Source: Code 2: Algorithme De Tri Rapide Tutoriel
OriginalL'auteur farhankhwaja
De l'essayer. Il va travailler pour vous.
OriginalL'auteur Abhas
//Tout mis en œuvre le testeur de classe pour cela et il va travailler
public int[] trier(int[] A, int, int ){
}
public int partition(int A[ ], int, int){
OriginalL'auteur TK Mphahlele
Ce devrait être tout à fait sur place. Le Code ci-dessous avec cette Image laisse plus de sens.
Profitez-en!
OriginalL'auteur hadenehapps
OriginalL'auteur Ragulan28
Quicksort est légèrement sensible à l'entrée qui se trouve être dans le bon ordre, auquel cas il peut ignorer certains swaps. Mergesort n'ont pas de telles optimisations, ce qui rend également Quicksort un peu plus rapide par rapport à Mergesort.
Pourquoi le tri Rapide est mieux que de Fusion de tri
OriginalL'auteur Aashish