Sortieren Sie ein Array auf der Grundlage der Werte im Array gespeichert. Sie können sicherlich ein Array von Zeigern auf Referenz alle Werte im Array verwenden, aber mit dem Zeigerarray zu sortieren, müssen Sie die Zeiger dereferenzieren, so dass Sie tatsächlich basierend auf den Werten sortieren.
Zum Beispiel erstellt die folgenden ein zufälliges Array von 100 Werten zwischen -100 und 100, ein Array von Zeigern ordnet die Werte zu verweisen, und sortiert dann die Werte der Zeiger-Array unter Verwendung von:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXI 100
int main (void) {
int arr[MAXI] = {0};
int *arrp[MAXI] = {NULL};
int i, j, swap;
srand (time (NULL));
for (i = 0; i < MAXI; i++) { /* generate random values */
arr[i] = rand() % (MAXI * 2 + 1) - MAXI; /* -100 < rand < 100 */
arrp[i] = &arr[i]; /* assign pointer value */
}
printf ("\noriginal array - by pointers\n\n");
for (i = 0; i < MAXI; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %4d", *(arrp[i]));
}
putchar ('\n');
for (i = 0; i < MAXI - 1; i++) { /* sort pointer array */
for (j = 0; j < MAXI - i - 1; j++) {
/* For decreasing order use < */
if (*(arrp[j]) > *(arrp[j + 1])) {
swap = *(arrp[j]);
*(arrp[j]) = *(arrp[j + 1]);
*(arrp[j + 1]) = swap;
}
}
}
printf ("\nsorted array - by pointers\n\n");
for (i = 0; i < MAXI; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %4d", *(arrp[i]));
}
putchar ('\n');
return 0;
}
Beispiel Verwendung/Output
$ ./bin/bubblesort
original array - by pointers
55 88 94 -50 64 -64 -23 39 43 -67
-75 44 -23 64 47 -18 -11 -50 76 -10
32 -35 -53 9 95 8 -28 53 -39 32
-88 67 -31 -94 -84 -68 93 -57 21 35
-74 46 -22 -46 9 76 36 99 -75 -39
-62 8 26 -65 67 -30 -6 -62 -77 5
21 86 -29 90 92 -63 73 85 -19 -7
19 -43 -61 48 11 48 23 97 -4 -2
-43 -16 -95 33 -30 72 -97 64 61 77
-32 -69 62 -10 -80 4 27 93 -12 58
sorted array - by pointers
-97 -95 -94 -88 -84 -80 -77 -75 -75 -74
-69 -68 -67 -65 -64 -63 -62 -62 -61 -57
-53 -50 -50 -46 -43 -43 -39 -39 -35 -32
-31 -30 -30 -29 -28 -23 -23 -22 -19 -18
-16 -12 -11 -10 -10 -7 -6 -4 -2 4
5 8 8 9 9 11 19 21 21 23
26 27 32 32 33 35 36 39 43 44
46 47 48 48 53 55 58 61 62 64
64 64 67 67 72 73 76 76 77 85
86 88 90 92 93 93 94 95 97 99
Sortierung Nur die Pointers
Wenn Sie nur das Array von Zeigern sortieren wollen und die ursprünglichen Feldwerte unberührt lassen, dass durch den Vergleich der dereferenced Werte als auch getan werden, aber dann tauschen nur die Zeiger:
int i, j, *swap;
...
for (i = 0; i < MAXI - 1; i++) { /* sort pointer array */
for (j = 0; j < MAXI - i - 1; j++) {
/* For decreasing order use < */
if (*(arrp[j]) > *(arrp[j + 1])) { /* compare values */
swap = arrp[j]; /* swap pointers */
arrp[j] = arrp[j + 1];
arrp[j + 1] = swap;
}
}
}
printf ("\nsorted array - by pointers\n\n");
for (i = 0; i < MAXI; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %4d", *(arrp[i]));
}
putchar ('\n');
printf ("\noriginal array\n\n");
for (i = 0; i < MAXI; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %4d", arr[i]);
}
putchar ('\n');
Drucken mit Die Zeiger geben die gleiche sortierte Reihenfolge, aber das direkte Drucken der Array-Werte liefert das ursprüngliche unsortierte Array. z.B.: In Funktion
$ sorted array - by pointers
-100 -99 -98 -98 -97 -95 -93 -93 -92 -86
-86 -84 -81 -75 -73 -72 -67 -65 -64 -63
-62 -59 -55 -53 -53 -52 -50 -48 -46 -42
-40 -40 -37 -32 -31 -31 -28 -28 -27 -23
-21 -20 -20 -17 -11 -9 -8 -6 -4 -4
-1 -1 0 2 6 18 21 22 22 23
24 26 26 28 29 33 34 34 34 36
39 42 43 43 52 58 58 61 62 65
67 70 70 73 79 80 80 80 80 81
82 89 89 90 92 92 94 97 98 100
original array
80 -99 21 -98 -63 -52 -59 -73 -75 2
-62 -53 -31 92 -31 -98 -32 36 -27 -28
-21 22 -6 -53 92 29 100 97 -40 -86
-64 90 -84 58 43 -97 -95 34 81 82
-65 -81 79 -46 61 98 -93 -72 -17 -20
0 62 52 94 -92 43 22 58 -11 33
73 26 -28 89 -67 -86 42 89 -1 23
70 34 -8 -1 39 -48 -4 -4 -20 80
26 80 -9 -23 24 -50 70 -55 -93 -42
28 80 34 -100 18 67 65 -40 6 -37
Sie müssen Array-of-Pointers Pass von Pointer auf Sortieren
Ein weiteres Problem mit Ihrer Funktion Sie einen Zeiger (ein Array von int) sind vorbei, aber um Sortieren nach Zeiger-Array, müssen Sie ein Array von Zeigern an die Sortierfunktion übergeben (zB pointer-to-pointer-to-int). Um in einer Funktion nur die Zeiger-Array zu sortieren, während das ursprüngliche Array unverändert zu lassen, können Sie die folgende verwenden:
/* sort an array of 'n' pointers to int in 'a' */
void psort (int **a, int n)
{
int i, j, *swap;
for (i = 0; i < n - 1; i++) { /* sort pointer array */
for (j = 0; j < n - i - 1; j++) {
/* For decreasing order use < */
if (*(a[j]) > *(a[j + 1])) { /* compare values */
swap = a[j]; /* swap only pointers */
a[j] = a[j + 1];
a[j + 1] = swap;
}
}
}
}
Dann in dem obigen Beispiel würden Sie die Art in main()
mit ersetzen:
psort (arrp, MAXI);
Dies würde zu den gleichen Ergebnissen führen, die oben für den Fall des Nur-Sortier-Zeigers angegeben wurden.
Sie tun die Auswahl sortieren? Sollten Ihre verschachtelten 'for'-Schleifen nicht so aussehen:' für (i = 0; i <(SIZE - 1); i ++) für (j = (i + 1); j
Ein Array von Zeigern zum Sortieren eines Integer-Arrays scheint ein bisschen seltsam. Was ist der Zweck dieser Anforderung? – EvilTeach
Was denkst du, was dieser Code macht? für (i = 0; i
EvilTeach