Ecco la mia risposta. È essenzialmente la stessa della risposta di VladimFromUa (una variante ricorsiva di bubble sort), ma invece di eseguire un numero fisso di esecuzioni, le esecuzioni aggiuntive vengono eseguite solo se viene rilevato che l'array è stato riordinato nella corsa precedente.
altro paio di differenze sono di seguito:
1. parametro indicizzare il punto di partenza nella matrice è stato eliminato mediante compensazione l'indirizzo della matrice in chiamate ricorsive. 2.Il controllo "se (prima < ultimo & & ultimo> 0)" in Vlad o "if (--p_length == 1)" nel mio codice viene eseguito meglio prima della chiamata ricorsiva che comporterebbe la lunghezza dell'array essere 1, poiché è una chiamata in meno nello stack.
Ho aggiunto un codice per leggere l'input dalla riga di comando e stampare entrambi gli array non ordinati e ordinati, per comodità.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef enum { FALSE, TRUE } boolean_t;
void
swap_int(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
boolean_t
sort_array(int p_array[], int p_length) {
boolean_t result;
if (p_array[0] > p_array[1]) {
swap_int(p_array, p_array + 1);
result = TRUE;
} else {
result = FALSE;
}
if (--p_length == 1) {
return result;
}
result |= sort_array(p_array + 1, p_length);
if (result) {
sort_array(p_array, p_length);
}
return result;
}
void
print_array_int(int p_array[], int p_length) {
int n;
for (n = 0; n < p_length - 1; n++) {
printf("%d, ", p_array[n]);
}
printf("%d\n", p_array[n]);
}
int
main(int argc, char **argv) {
int *array;
int array_length = argc - 1;
int n;
array = malloc(array_length * sizeof(*array));
for (n = 0; n < array_length; n++) {
sscanf(argv[n + 1], "%d", array + n);
}
printf("\nUnsorted array:\n");
print_array_int(array, array_length);
sort_array(array, array_length);
printf("\nSorted array:\n");
print_array_int(array, array_length);
return 0;
}
Può spiegare perché si vuole fare bubble sort ricorsivo? Non sembra una buona idea ... –
La ricorsione IMHO non è davvero utile per il bubble sort (per aumentarne la leggibilità o le prestazioni). Fondamentalmente si dovrebbe semplicemente cambiare il primo 'for' in una ricorsione. 'RecBSort (arr, i) {...; RecBSort (arr, i ++)} '. Che è abbastanza inutile. –
voglio solo provare a convertire "qualsiasi" codice noto basato sull'iterazione in un codice ricorsivo equivalente, per comprendere meglio la ricorsione ... l'ordinamento di bolle mi è venuto in mente inizialmente come un classico esempio di codice basato sull'iterazione ... nessun altro motivo specifico per scegliere bubble-sort ... – goalseeker29