2016-07-15 4 views
0

Ich bekomme eine Nachricht, wenn ich versuche, das Programm zu starten. Warum?Sortierung Array nur mit while und wenn

Segmentation fault 

mein Code:

#include <stdio.h> 

void sort_array(int *arr, int s); 

int main() { 
    int arrx[] = { 6, 3, 6, 8, 4, 2, 5, 7 }; 

    sort_array(arrx, 8); 
    for (int r = 0; r < 8; r++) { 
     printf("index[%d] = %d\n", r, arrx[r]); 
    } 
    return(0); 
} 

sort_array(int *arr, int s) { 
    int i, x, temp_x, temp; 
    x = 0; 
    i = s-1; 
    while (x < s) { 
     temp_x = x; 
     while (i >= 0) { 
      if (arr[x] > arr[i]) { 
       temp = arr[x]; 
       arr[x] = arr[i]; 
       arr[i] = temp; 
       x++; 
      } 
      i++; 
     } 
     x = temp_x + 1; 
     i = x; 
    } 
} 

Ich denke, dass das Problem in der if Aussage. Was denkst du? Warum passiert das? Ich denke, dass ich positiv mit dem Zeiger auf das Array verwende.

Vielen Dank!

+2

'i' wird zu groß und verursacht einen Zugriff außerhalb des Bereichs, der * undefiniertes Verhalten * auslöst. – MikeCAT

+2

Kompilieren Sie das Programm mit -g und führen Sie es unter gdb aus, dies zeigt Ihnen, wo es fehlschlägt – pm100

+0

Versuchen Sie es mit der Methode [bubble sort] (https://en.wikipedia.org/wiki/Bubble_sort) (wie es verwendet wurde [ hier] (http://www.sanfoundry.com/c-program-sort-array-ascending-order/) um ein Array in aufsteigender Reihenfolge zu sortieren) – iRove

Antwort

2

Diese Schleife in Ihrem Programm

while (i >= 0) { 
     //... 
     i++; 
    } 

macht keinen Sinn, weil i unconditionly erhöht.

Das Programm kann sehen die folgende Art und Weise

#include <stdio.h> 

void bubble_sort(int a[], size_t n) 
{ 
    while (!(n < 2)) 
    { 
     size_t i = 0, last = 1; 

     while (++i < n) 
     { 
      if (a[i] < a[i-1]) 
      { 
       int tmp = a[i]; 
       a[i] = a[i-1]; 
       a[i-1] = tmp; 
       last = i; 
      } 
     } 

     n = last; 
    } 
} 

int main(void) 
{ 
    int a[] = { 6, 3, 6, 8, 4, 2, 5, 7 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    bubble_sort(a, N); 

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    return 0; 
} 

Die Programmausgabe ist

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

Wenn Sie möchten, dass die Sortierfunktion nur eine while-Schleife hatte, dann können Sie es die folgende Art und Weise implementieren

void bubble_sort(int a[], size_t n) 
{ 
    size_t i = 0; 

    while (++i < n) 
    { 
     if (a[i] < a[i-1]) 
     { 
      int tmp = a[i]; 
      a[i] = a[i-1]; 
      a[i-1] = tmp; 
      i = 0; 
     } 
    } 
} 
2

In Ihrer inneren Schleife erhöhen Sie i über die Größe des Arrays hinaus. Ihr Algorithmus sollte Sie stattdessen dazu veranlassen, i zu dekrementieren, aber ich bin nicht sicher, dass dies ausreichen würde, um den Sortieralgorithmus zu beheben.

Sie sollten zunächst versuchen Blase Art mit einer einzigen while Schleife zu implementieren, wo Sie benachbarte Elemente zu vergleichen, und einen Schritt zurück, wenn Sie sie tauschen.