2017-02-14 1 views
0

Ich lese die 'ANSI-C Programmiersprache' im Rekursionsteil. Ich bin mit dem Rekursion Beispiel:Warum Quick sort function den Wert des Arguments ändern

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 

static int v[] = {1,3,6,1,2,3,6,89,3,5,7,2,3}; 
int size = sizeof(v)/sizeof(v[0]); 

void sy_swap (int v[], int i, int j); 
void sy_qsort(int v[], int left, int right); 

/*Swap function*/ 
void sy_swap (int v[], int i, int j) 
{ 
    int temp; 
    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

/*Sort function*/ 
void sy_qsort(int v[], int left, int right) 
{ 
    int i, last; 
    static int loop = 0; 

    if(left >= right){ /*Finish sort*/ 
     return; 
    } 
    sy_swap(v, left, (left + right)/2); /*Move middle element to beginning of the half*/ 
    last = left; 
    for(i = left+1; i<=right; i++){ /*After this loop, we have to half: smaller than 'middle element' and bigger*/ 
     if (v[i] < v[left]){ 
      sy_swap(v, ++last, i); 
     } 
    } 
    sy_swap(v, left, last); /*Move 'middle element' to the head of SMALL half, to finish division the array into 2 half*/ 

    sy_qsort(v,left, last-1); /*Sort Small Half*/ 
    sy_qsort(v, last+1, right); /*Sort Big Half*/ 

} 

int main(void) 
{ 
    int i = 0; 

    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' before sort*/ 
    sy_qsort(v,0,size); 
    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' after sort*/ 

    for (i =0; i<size; i++){ 
     printf("%d,",v[i]); 
    } 

    return (0); 
} 

Sie jemand wissen, warum ‚Größe‘ Variable nach Sortierfunktion geändert wurde genannt wurde, obwohl sie keinen Betrieb innerhalb Sortierfunktion ist ändern, um das ‚richtige‘ Argument?

Dies ist das Ergebnis zeigen, dass ‚Größe‘ von den tatsächlichen 13 (Gesamtzahl der Elemente in einem Array) geändert wurde auf 89 (größte Element in Array)

sizes: size of v=52, size of v[0]=4, total elements=13 
sizes: size of v=52, size of v[0]=4, total **elements=89** 
1,1,2,2,3,3,3,3,5,6,6,7,13,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...... 

Antwort

3

Sie haben undefiniertes Verhalten weil Sie umfassen die size des Arrays als gültigen Index, was es nicht ist.

Nehmen Sie zum Beispiel der Schleife

for(i = left+1; i<=right; i++) 

In dem ersten Aufruf von sy_qsort vom main Funktion ist die Variable right zu size gleich, die die Größe des Arrays, aber als ein Index ist es ein jenseits das letzte Element. Die Bedingung muss i < right sein.

+1

Vielen Dank, Sie haben Recht. Da links, rechts der Index des Elements in arry ist, muss die Sortierfunktion aufgerufen werden: sy_qsort (v, 0, size-1); – sydc