2009-11-01 8 views
1

Je suis en train de comprendre un code, exactement ce &(ipA[iLower + 1] signifie dans le code ci-dessous (fonction de partition d'un quicksort?Un débutant C question

void Partition(int* ipA, int iSize) { 

    // Partitions of size 0 or 1 are already sorted 
    if (iSize <= 1) { 
     return; 
    } 

    // Select a pivot from the array randomly 
    int iPivot = ipA[rand() % iSize]; 

    // Indices of the entries to be swapped 
    int iLower = 0; 
    int iUpper = iSize - 1; 

    // Partition array into sections above and below the pivot 
    while (iLower < iUpper) { 

     while (ipA[iLower] < iPivot) { 
      ++iLower; 
     } 

     while (ipA[iUpper] > iPivot) { 
      --iUpper; 
     } 

     // Swap the entries at the lower and upper indices 
     int iTemp  = ipA[iLower]; 
     ipA[iLower]  = ipA[iUpper]; 
     ipA[iUpper]  = iTemp; 
    } 

    // Recursively call partition on each partititon. 
    Partition(ipA, iLower); 
    Partition(&(ipA[iLower + 1]), iSize - iUpper - 1); 
} 

Répondre

2

La méthode Partition est appelée à partir de la partition à chaque fois que le tableau transmis est divisé à deux réseaux un à partir du début de la rangée courante et l'autre de l'indice de iLower + 1.

& signifie que l'adresse du (pointeur) de manière à l'appel & (IPA [iLower + 1] est comme appeler un nouveau tableau (un pointeur en C/C++) à partir de l'adresse de la cellule insinde i pA à l'index iLower + 1.
Parce que le passage de tableaux dans C est fait en passant le pointeur à leur début, il passe efficacement un tableau qui commence dans cette adresse.

+0

merci beaucoup pour l'explication, je me demande comment pourriez-vous faire cette partie avec java? – Hellnar

+2

Vous ne pouviez pas, au moins, pas directement. Soit vous devez créer un nouveau tableau et copier sur les valeurs que vous voulez (cher), soit vous modifiez la fonction de partition pour prendre un index de départ. Dans ce cas, parce que la fonction modifie le tableau, seule la dernière approche fonctionnera. – Thomas