2017-07-23 2 views
1

Ich versuche, eine Reihe von zweidimensionalen Array zu sortieren. Aber ich kann es nicht erreichen.Sortieren von Elementen in einer Zeile in einem zweidimensionalen Array mit Zeigern

Für zB:

7 6 5 
    5 7 6 
    8 2 9 
    2 3 4 

so sein:

5 6 7 
    5 6 7 
    2 8 9 
    2 3 4 

Unten ist mein Code:

void sort(int *a,int num){ 
    int i,j,temp; 
    for(i=0;i<num-1;i++){ 
     for (j=0;j<num-i-1;j++){ 
      if (*((a+i*3)+j)>*((a+i*3)+j+1)){ 
       temp=*((a+i*3)+j); 
       *((a+i*3)+j)=*((a+i*3)+j+1); 
       *((a+i*3)+j+1)=temp; 
      } 
     } 
    } 

    for(i=0;i<num;i++){ 
     for(j=0;j<3;j++) 
      printf("%d ",*((a+i*3)+j)); 
     printf("\n"); 
     } 
} 

Ausgabe des obigen Codes:

6 5 5 
    7 6 7 
    2 8 9 
    2 3 4 

Kann jemand sagen, was das Problem im Code ist? Vielen Dank im Voraus. : D

EDIT: Also sollte der obige Code so aussehen?

void sort(int *a,int num){ 
    int i,j,temp; 
    for(i=0;i<num-1;i++){ 
     for (j=0;j<num-i-1;j++){ 
      if (*(*(a+i)+j)>*(*(a+i)+j+1)){ 
       temp=*(*(a+i)+j); 
       *(*(a+i)+j)=*(*(a+i)+j+1); 
       *(*(a+m)+j+1)=temp; 
      } 
     } 
    } 
} 
+0

Es gibt kein 2D-Array. Nur ein Zeiger auf 'int'. Die Verwendung eines 2D-Arrays (bzw. eines Pointers auf ein 1D-Array) und des Indexoperators würde dieses Chaos halbwegs lesbar machen. – Olaf

Antwort

2

Es gibt zwei Hauptprobleme:

1) die Schlaufen sind nicht für die n-mal ausgeführt wird, daher der Zustand, in für die Schleife zu i < num anstelle von i < num - 1 geändert werden soll, die

2) die letzte Zeile überspringt Aus Ihrem Code scheint es, dass Sie die Blasensortiertechnik verwenden möchten. Die Sortierung ist O (n^2) und deshalb muss die swapping if-Anweisung (n - 1) mal für jedes Element ausgeführt werden. Daher sollten Sie eine weitere for-Schleife in die j-for-Schleife einfügen.

+0

Oh! Vielen Dank ... habe nicht an die nächste Runde gedacht. Thx noch einmal. : D – nimish642

1

Der Code ist zu kompliziert, so dass Sie viele kleine Fehler darin gemacht haben.

Sie trennen sollte irgendwie jeder Zeile sortiert wird, werden wie folgt aus:

for (row = 0; row < num; row++) { 
    sort_row(a + row * 3); 
} 

Die Funktion sort_row Sorten nur eine Zeile, so dass es leichter sein wird zu schreiben und zu testen (BTW I ersetzt den unscheinbaren Namen i durch row). Die Funktion sort_row sollte die normale Blasensortierung durchführen. Sie können stattdessen auch die Standardbibliothek qsort verwenden (zu Testzwecken).

Beachten Sie, dass der standardmäßige Bubble-Sort-Algorithmus mit zwei verschachtelten Schleifen implementiert ist. Wenn Sie Ihren Code ohne separaten Funktionsaufruf sort_row implementieren möchten, benötigen Sie drei verschachtelte Schleifen.

+0

Thx, anatolyg Ich werde daran denken, Bibliotheksfunktion beim nächsten Mal zu verwenden ...: D – nimish642

Verwandte Themen