2017-02-24 1 views
-1
public static void quickSort(Integer[] arr, int low, int high) 
    { 
     //check for empty or null array 
     if (arr == null || arr.length == 0){ 
      return; 
     } 

     if (low >= high){ 
      return; 
     } 

     //Get the pivot element from the middle of the list 
     int middle = low + (high - low)/2; 
     int pivot = arr[middle]; 

     // make left < pivot and right > pivot 
     int i = low, j = high; 
     while (i <= j) 
     { 
      //Check until all values on left side array are lower than pivot 
      while (arr[i] < pivot) 
      { 
       i++; 
      } 
      //Check until all values on left side array are greater than pivot 
      while (arr[j] > pivot) 
      { 
       j--; 
      } 
      //Now compare values from both side of lists to see if they need swapping 
      //After swapping move the iterator on both lists 
      //NUMBER (1) 
      if (i <= j) 
      { 
       swap (arr, i, j); 
       i++; 
       j--; 
      } 
     } 
     //Do same operation as above recursively to sort two sub arrays 
     //NUMBER (2) 
     if (low < j){ 
      quickSort(arr, low, j); 
     } 
     //NUMBER (3) 
     if (high > i){ 
      quickSort(arr, i, high); 
     } 
    } 

Je suis un débutant dans l'algorithme quicksort. Quelqu'un peut-il me dire quel est le but des conditions à savoir si le nombre (1), si le nombre (2) et si le nombre (3) dans l'algorithme quicksort ci-dessus?Quicksort supprimer certaines des conditions

Pour le nombre (1), la condition que je ressens n'est pas nécessaire car je serai certainement plus petit ou égal à j et donc le swap devrait simplement s'exécuter.

Pour le nombre (2) et le nombre (3), c'est une explication similaire. S'il vous plaît me corriger si je me trompe vous remercie

+0

Pouvez-vous me donner un échantillon d'élément de tableau non ordonné de prouver que je peux être supérieure à j qui exécute le swap correctement afin que je puisse visualiser. merci – Desmond

+0

En fait, il semble que, comme cela est actuellement écrit, 'i <= j' sera toujours vrai à' NUMBER (1) '. Je ne pense pas que cet algorithme soit correctement implémenté. – khelwood

Répondre

0

Numéro 1 - les deux anciens for boucles vérifient juste pour les bons éléments d'échange (du côté gauche et à droite) alors quand les positions d'index i et j sont calculés, cette condition voir s'ils sont dans une position qui doit être permutée (parce que l'un est implicitement supérieur à l'autre).

Les numéros 2 et 3 font partie de l'algorithme "Diviser pour régner", cette partie ne fait que diviser le tableau en deux parties plus petites.

Jetez un oeil à this (source wikipedia)

+0

Je comprends l'approche de diviser pour régner. Cependant, je pense que je serai toujours inférieur à j et bas je. Par conséquent, il n'est pas nécessaire de mettre ces conditions. S'il vous plaît donnez-moi un contre-exemple pour réfuter cela si possible merci – Desmond

+0

Non, désolé, ce n'est pas la bonne façon. Je suggère que vous déboguez ce code étape par étape et étudiez l'algorithme, il y a de la documentation, des messages et de la vidéo qui l'expliquent en détail. – freedev

+0

L'idée de pivot dans le tri rapide est la percée qui permet à cet algorithme d'être meilleur que les autres. – freedev