2016-12-05 2 views
-2

Ich versuche, einen Algorithmus zu schreiben, der Elemente in einer Liste in aufsteigender Reihenfolge sortiert (Einfügesortierung). Ich starte die Hauptfunktion, indem ich alle folgenden Variablen (und Arrays) als int definiere. Hier ist die Sortierfunktion:Segmentierungsfehler beim Einfügen-Sortieren in C

void sort(int a, int b , int list[], int i) 
{ 
    for(i=1; i<(b); i++) 
    { 
     while(list[i-1]>list[i]) 
     { 
      a = list[i-1]; 
      list[i-1]=list[i]; 
      list[i]=a; 
      i--; 
     } 
    } 
} 

b die Anzahl der Elemente in der Liste ist, und ein als 0 in Haupt initialisiert.

Wenn ich in der Hauptfunktion sortiere mit einer Tabelle von positiven ganzen Zahlen, sortiert sie in der gewünschten Weise. Wenn jedoch einige der Werte negativ sind, erzeugt das Programm einen Segmentierungsfehler.

Kann mir jemand helfen, den Fehler zu finden? Vielen Dank!

+0

Ein Segmentierungsfehler bedeutet fast sicher, dass Sie auf Speicher zugreifen, der Ihnen nicht gehört. Studiere deine innere Schleife. Siehst du irgendeinen Weg, wie du über einen Index, der kleiner als 0 oder größer als die Anzahl der Elemente minus eins ist, auf "Liste" zugreifen kannst? –

+1

Es ist normalerweise eine schlechte Idee, den Wert von "i" selbst in der for-Schleife zu ändern, die "i" als Schleifeninkrement verwendet. Wenn Sie das erste Mal innerhalb der while-Schleife dekrementieren, wird es 0, und dann versuchen Sie, auf "list [-1]' – bruceg

+1

@bruceg Debatable zuzugreifen (ich mache das sehr, wenn ich Parser schreibe, um Zeichen zu überspringen), aber in Dieser Fall ist es sicherlich. – YoYoYonnY

Antwort

2

In der ersten Schleife (das heißt, wenn i 1), dann ist dieser Teil

while(list[i-1]>list[i]) 

die gleiche wie

while(list[0]>list[1]) 

die OK ist. Nehmen Sie nun an, dass list[0]>list[1] wahr ist. Dann werden Sie tun:

a = list[i-1];  ---> same as a = list[0]; 
    list[i-1]=list[i]; ---> same as list[0]=list[1]; 
    list[i]=a;   ---> same as list[1]=a; 
    i--;    ---> Now i becomes 0 

was auch OK ist. Aber die nächste Anweisung lautet

Der illegale Zugriff ist wahrscheinlich die Ursache des seg-Fehlers.