2009-10-14 8 views
1

Ceci est tout mon code pour ma méthode quicksort, cela fonctionne sur un ensemble de 21 nombres, mais pas sur mon jeu de données réel, qui est d'environ 100000. Je n'ai aucune idée de ce qui ne va pas, j'ai été bidouillant pendant deux heures et il est dû bientôt! Toute aide serait la bienvenueQuicksort ne fonctionne pas

public static void hybridQuicksort(int[] a, int start, int end) 
{ 
    final int MIN = 13; 
    if (end - start >= MIN) 
    { 
     int pivot = findPivot(a, start, end); 
     pivot = partition (a, start, end, pivot); 
     hybridQuicksort(a, start, pivot - 1); 
     hybridQuicksort(a, pivot + 1, end); 
    } 
    else 
    { 
     insertionSort(a, start, end); 
    } 
} 

//partitions the array based on the pivot 
public static int partition(int[] a, int start, int end, int pivot) 
{ 
    int up = start + 1; 
    int down = end; 

    while (up <= down) 
    { 

     while (a[up] <= pivot) 
      up++; 

     while (a[down] > pivot) 
      down--; 

     if (up <= down) 
      swap(a, up, down); 
    } 

    swap(a, start, down); 

    return up; 
} 

//finds the first, middle, middle of first and middle, middle of middle and last 
//and last numbers and sets their median as the pivot 
public static int findPivot(int[] a, int start, int end) 
{ 
    //swap the 4 numbers to the start of the array, leaving the first as is 
    swap(a, start + 1, end - 1); 
    swap(a, start + 2, (start + end)/2); 
    swap(a, start + 3, end/4); 
    swap(a, start + 4, (end/2) + (end/4)); 

    //sort the 5 numbers 
    insertionSort(a, 0, 5); 

    //swap the median to the front, that's the pivot 
    swap(a, start, start + 2); 
    //return the pivot 
    return a[start]; 
} 
+0

Ce n'est pas vraiment un endroit pour résoudre des questions de devoirs; en particulier ceux qui sont presque dus. Peut-être que vous devriez demander à un camarade de classe ou regarder quelques-uns des tutoriels qsort en ligne. –

+6

Si vous regardez le code, vous remarquerez qu'il est complet, donc personne ne «résout» mon problème de devoirs. J'ai fait presque tout ça, il y a juste un petit pépin là-dedans que je n'arrive pas à trouver alors j'espérais que quelqu'un jetterait un coup d'œil et verrait s'ils peuvent le trouver. Est-ce faux? – Tanner

+0

En fait, je prends ce que j'ai dit; alors que la médiane de 5 insert sort était/est toujours fausse, que c'était un problème de partitionnement n'est ce pas (j'ai perdu de vue des morceaux de code); lexu est juste cependant. – CoderTao

Répondre

2

Assomption:

  • a détient 10'000 échantillons,
  • départ est de 500
  • fin est 1000

    //swap the 4 numbers to the start of the array, leaving the first as is 
    swap(a, start + 1, end - 1); 
    swap(a, start + 2, end/2); 
    swap(a, start + 3, end/4); 
    swap(a, start + 4, (end/2) + (end/4)); 
    

fin/4 est 250

.. vous échangez des valeurs en dehors de votre sous-ensemble de tri.

+0

Ian m'a donné l'idée, aujourd'hui quand je l'ouvre à nouveau, je vais passer dans un intervalle de temps, donc ça va réparer ça! Merci – Tanner

0

Cela ne ressemble pas à un problème de devoirs. Si c'était un problème de devoirs, l'auteur aurait écrit environ sept à dix lignes de code, avec une preuve d'efficacité, et l'a fait entrer. Ce type essaie d'être chic, et ça le mord dans le derrière. Vous pouvez dire par la façon dont il tombe à insertion-tri pour les soi-disant "petits" intervalles. (Indice: la taille de l'intervalle de seuil est plus de la moitié de la taille des données de test .. Donnez à votre algorithme une certaine marge de recurse si vous voulez bien le tester.) Deuxièmement, il fait un travail supplémentaire pour trouver un pivot idéal. Ce genre de complexité a un coût.

Ceci est un amateur au travail. Ce dont il a besoin n'est pas seulement une réponse. Il a besoin d'une approche pour résoudre les problèmes difficiles. Quicksort est juste le véhicule de cette éducation.

Voici mon approche.

L'astuce consiste à écrire Quicksort en tant que Quicksort, à le faire fonctionner, puis à s'inquiéter des astuces spéciales. Tuez le bruit à propos de l'insertion en triant les petits intervalles. Supposons simplement que tout intervalle de taille zéro ou un est déjà trié (ce qui est votre cas de base) et travaillons à faire fonctionner votre code de partitionnement en utilisant l'extrémité gauche de l'intervalle comme pivot (comme dans le Quicksort original classique). Envisagez d'imprimer les résultats de vos données après un passage de partition afin de vous montrer que cela fonctionne. Vous allez développer des compétences de test de cette façon. Quoi qu'il en soit, une fois que vous avez un quicksort de travail, alors vous pouvez faire des choses comme séparer la sélection du pivot dans une fonction et jouer avec l'implémentation.

Bonne chance, et appréciez votre projet. Ne pas oublier, cependant: Nous voulons des minutages, et surtout des comparaisons de temps avec la routine de tri dans la bibliothèque standard!

+0

Tout cela est dans la mission. Pour tester, j'imprimais le pivot, le tableau après que findPivot passe par dessus le tableau, chaque échange effectué (c'était beaucoup à faire) et ensuite une comparaison des tableaux avant et après le partitionnement. – Tanner

+0

Une affectation, alors. Eh bien, d'autres ont signalé certains bugs spécifiques. Un motif de bogue que je vois est une confusion des entiers qui représentent les index dans le tableau avec les entiers qui représentent les données à trier. Ainsi, par exemple, essayez de renommer "pivot" en "pivot_index" et "pivot_value" dans votre code, et vous verrez que la plupart des problèmes vous sautent aux yeux. La même chose est vraie de votre "départ" et "fin". Maintenant, si à la place vous avez passé "start" et "interval size" alors une partie des maths pourrait être plus facile ... – Ian

+0

Il semblerait que la seule faille soit probablement dans find_pivot en dehors de la plage. – Ian