2016-12-09 2 views
0

Code:Blase Art in C: Funktion nicht ändern Arraydaten

#include <stdio.h> 

void testSort(int values[], int n); 

int main(void) 
{ 
    int hs[] = {5,3,2,1,4}; 
    printf("Unsorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]); 
    testSort(hs, 5); 

    printf("Sorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]); 
} 

void testSort(int values[], int n) 
{ 
    for (int i = 0; i < n-1; i++) 
    { 
     int hold; 
     int current = values[i]; 
     int next = values[i + 1]; 

     if (current > next) 
     { 
      hold = current; 
      current = next; 
      next = hold; 
     } 
    } 
    return; 
} 

Ich versuche Blase Art zu tun, und jetzt geht es durch das Array einmal, aber meine Frage ist: Warum nicht meine ist hs[] Aktualisierung nach Aufruf der Funktion? Die zweite printf zeigt, dass es gleich geblieben ist.

EDIT: Wie bereits erwähnt, stellt sich heraus, ich war Ändern von Daten, aber der Kopien. Ich aus irgendeinem Grund, wenn ich die Variablen erstellt current/next Ich fühlte mich, als ob sie values[i]/values[i+1] vertreten waren, aber in Wirklichkeit war ich gerade neue Variable erstellen und vorbei der Wert von values[0] die 5 ist und es zu current zuweisen. Offensichtlich Werte [] unverändert lassen. Vielen Dank allen

+1

Sie müssen 'Werte [i]' mit 'Werten [i + 1]' vertauschen. Der ganze Code tauscht die Kopien in 'current' und' next'. – user3386109

+1

Ihre Funktion ändert 'values ​​[i]' nirgends. – melpomene

+0

@Fang Sie können ein Array nicht nach Wert übergeben, es wird in einen Zeiger auf sein erstes Element zerlegt. – Quentin

Antwort

2

Das Problem ist, dass Sie nur die Funktion der lokalen Variablen ändern, nicht die Elemente des Arrays.

Es ist das gleiche Prinzip wie, warum dieses Programm 1 gedruckt wird und nicht 2:

int main() 
{ 
    int array[] = {1}; 
    int x = array[0]; 
    x = 2; 
    printf("array[0] = %d\n", array[0]); 
    return 0; 
} 

Sie müssen Werte des Arrays Elemente zuweisen:

void testSort(int values[], int n) 
{ 
    for (int i = 0; i < n-1; i++) 
    { 
     if (values[i] > values[i+1]) 
     { 
      int hold = values[i]; 
      values[i] = values[i+1]; 
      values[i+1] = hold; 
     } 
    } 
} 

Nachdem Sie dieses Problem behoben haben, Sie werden feststellen, dass diese Funktion nur für einige Eingaben funktioniert.
Die Lösung dieses Fehlers bleibt als Übung bestehen.

0

Bitte versuchen Sie unten Code: -

void bubble_sort(int list[], int n){ 
     int c, d, t; 
     for (c = 0 ; c < (n - 1); c++) 
     { 
     for (d = 0 ; d < n - c - 1; d++) 
      { 
      if (list[d] > list[d+1]) 
      { 
       t   = list[d]; 
       list[d] = list[d+1]; 
       list[d+1] = t; 
      } 
      } 
    } 
} 
+0

Eine kleine Erklärung könnte hier helfen. –

+0

zuerst werden Sie versuchen, diesen Code & Check ist es Arbeit oder nicht. Dann werde ich es erklären –

+0

@SarikaKoli: Nein, das ist Unsinn. Sie machen Vorschläge, um den Code zu ändern und sollten sie daher sofort erklären, nicht nachdem jemand anderes die Richtigkeit der Lösung überprüft hat. (Das ist Ihre Aufgabe als Antwort, nebenbei: Arbeitscode zur Verfügung zu stellen. Ob es darum geht, selbstsicher zu sein oder den tatsächlichen Code zu testen, spielt keine Rolle.) –