Вы можете сделать это, пройдя массив один раз, от 0 до его последнего элемента.Вам просто нужно подумать о том, с чем вам нужно сравнить или поменять местами «текущий» элемент, и это станет довольно просто.
Вам придется сохранить несколько дополнительных переменных, чтобы отслеживать текущий элемент, и«другой» элемент, с которым вам нужно сравнить его.
Кроме того, вы можете рассмотреть основные стили форматирования кода C.Нет стиля, который делает всех на 100% счастливыми, но есть множество стилей, которые делают всех несчастными.
---- Отредактировано ----
Хорошо, это гораздо больше похоже напроблема «дразнилки», а не серьезная проблема информатики.Проблема в том, что «дополнительная память» очень плохо определена, и поэтому вы можете достичь результата, если вы помните, что рекурсия разрешена только в языке программирования, и что рекурсивный вызов требует дополнительного стека (который никто не собирается рассматривать выделение памяти так, как этого требует реализация языка программирования).
По сути, такой вопрос предназначен для того, чтобы увидеть, смотрите ли вы на проблему и видите ли рекурсивное решение.*
#include <stdio.h>
void sort(int index, int start1, int end1, int start2, int end2, int* array) {
if (index >= end2) {
return;
}
int lower;
if (array[start1] <= array[start2]) {
lower = array[start1];
sort(index+1, start1+1, end1, start2, end2, array);
} else {
lower = array[start2];
sort(index+1, start1, end1, start2+1, end2, array);
}
array[index]=lower;
}
int main(int argc, char** argv) {
int a[] = {1,3,6,8,-5,-2,3,8};
sort(0, 0, 3, 4, 7, a);
int i;
for (i = 0; i <= 7; i++) {
printf("%d, ", a[i]);
}
printf("\n");
return 0;
}
Это чит?Вам решать.Однако сортировка была выполнена на месте, и кэшированные числа были аккуратно спрятаны в локальном пространстве в стеке вызовов, где вы не можете их реально выделить / отменить.
Возможна дополнительная оптимизация, ноони являются улучшением основной идеи: используйте рекурсию и стек вызовов для кэширования информации.