2016-04-01 12 views
-4
int arr1[] = { 3, 9, 6, 7 }, arr2[] = { 2, 5, 1 }, arr3[] = { 0 }, 
arr4[] = { 1, 6 }, arr5[] = { 4, 5, 6, 2, 1 }; 
int* pointersArray[5] = { &arr1, &arr2, &arr3, &arr4, &arr5 };  
for (k = 0; k< 5; k++) 
{ 
    for (i = 0; i < **(pointersArray + k)+1; i++) 
    { 
     for (j = i + 1; j < **(pointersArray + k); ++j) 
     { 
      if ((*(*(pointersArray + k) + i)) > *(*(pointersArray + k) + j)) 
      { 
       temp = *(*(pointersArray + k) + i); 
       *(*(pointersArray + k) + i) = *(*(pointersArray + k) + j); 
       *(*(pointersArray + k) + j) = temp; 
      } 
     } 
     printf("\n"); 
    } 
} 
for (j = 0; j < 5; j++) 
{ 
    for (i = 0; i < **(pointersArray + j) + 1; i++) 
    { 
     printf("%d", *(*(pointersArray + j) + i)); 
    } 
    printf(" "); 
} 

I jedes Array in pointersArray sortiert werden soll (die Größe jeder Anordnung ist die erste Zelle + 1), ohne die erste Zellsortierung. Oben ist mein nicht funktionierender Code, irgendwelche Ideen, um es zu reparieren?Sortierung Array von Zeigern auf Integers

Ausgang:

3697 
251 
0 
16 
256 

Erwartete Ausgabe:

3679 
215 
0 
16 
41256 
+0

Was ist die erwartete Ausgabe? – flaviodesousa

+2

Ja - Sie könnten versuchen, es zu debuggen. –

+0

Refactor die innerste Schleife in eine Vergleichsfunktion. (Sie sollten wahrscheinlich aus der Schleife ausbrechen, sobald Sie verschiedene Gegenstände gefunden haben.) –

Antwort

2

Hier, bitte.

#include <stdio.h> 

int main(void) 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 
    const size_t N = sizeof(pointersArray)/sizeof(*pointersArray); 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k]; 

     for (size_t i = 0; i < n; i++) 
     { 
      for (size_t j = 1; j < n - i; j++) 
      { 
       if (pointersArray[k][j+1] < pointersArray[k][j]) 
       { 
        int tmp = pointersArray[k][j+1]; 
        pointersArray[k][j+1] = pointersArray[k][j]; 
        pointersArray[k][j] = tmp; 
       } 
      } 
     } 
    } 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k] + 1; 
     for (size_t i = 0; i < n; i++) printf("%d ", pointersArray[k][i]); 
     printf("\n"); 
    }   

} 

Die Programmausgabe ist

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6 

berücksichtigen, dass es einfacher wäre, und der Code aussehen würde klarer, wenn Sie die Standard-C-Funktion verwenden qsort stattdessen die Blase Sortierfunktion manuell zu schreiben.

Zum Beispiel

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

int cmp(const void *lhs, const void *rhs) 
{ 
    int a = *(int *)lhs; 
    int b = *(int *)rhs; 

    return (b < a) - (a < b); 
} 

int main(void) 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 
    const size_t N = sizeof(pointersArray)/sizeof(*pointersArray); 

    for (size_t i = 0; i < N; ++i) 
    { 
     qsort(pointersArray[i] + 1, *pointersArray[i], sizeof(int), cmp); 
    } 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k] + 1; 
     for (size_t i = 0; i < n; i++) printf("%d ", pointersArray[k][i]); 
     printf("\n"); 
    }   

} 

Der Ausgang der gleiche sein wird wie oben

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6 

In C++ gezeigt können Sie Standard-Algorithmus std::sort in Header deklariert verwenden <algorithm>. Zum Beispiel

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 

    for (auto p : pointersArray) 
    { 
     std::sort(p + 1, p + 1 + *p); 
    } 

    for (auto p : pointersArray) 
    { 
     size_t n = *p + 1; 
     for (size_t i = 0; i < n; i++) std::cout << p[i] << ' '; 
     std::cout << std::endl; 
    }   

} 

Der Ausgang ist

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6