for(i = left+1; i ‹= right; i++) /* деление на части */
if (v[i] ‹ v[left])
swap(v, ++last, i);
swap(v, left, last); /* перезапоминаем делящий элемент */
qsort(v, left, last-1);
qsort(v, last+1, right);
}
В нашей программе операция перестановки оформлена в виде отдельной функции (
/* swap: поменять местами v[i] и v[j] */
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
Стандартная библиотека имеет функцию qsort, позволяющую сортировать объекты любого типа.
Рекурсивная программа не обеспечивает ни экономии памяти, поскольку требуется где-то поддерживать стек значений, подлежащих обработке, ни быстродействия; но по сравнению со своим нерекурсивным эквивалентом она часто короче, а часто намного легче для написания и понимания. Такого рода программы особенно удобны для обработки рекурсивно определяемых структур данных вроде деревьев; с хорошим примером на эту тему вы познакомитесь в параграфе 6.5.
Упражнение 4.12. Примените идеи, которые мы использовали в
Упражнение 4.13. Напишите рекурсивную версию функции
4.11 Препроцессор языка Си
Некоторые возможности языка Си обеспечиваются препроцессором, который работает на первом шаге компиляции. Наиболее часто используются две возможности: #include, вставляющая содержимое некоторого файла во время компиляции, и #define, заменяющая одни текстовые последовательности на другие. В этом параграфе обсуждаются условная компиляция и макроподстановка с аргументами.
4.11.1 Включение файла
Средство
#include "
или
#include ‹
заменяется содержимым файла с именем
Часто исходные файлы начинаются с нескольких строк
Средство
4.11.2 Макроподстановка
Определение макроподстановки имеет вид:
#define
Макроподстановка используется для простейшей замены: во всех местах, где встречается лексема
Любое имя можно определить с произвольным замещающим текстом. Например:
#define forever for(;;) /* бесконечный цикл */
определяет новое слово
Макроподстановку можно определить с аргументами, вследствие чего замещающий текст будет варьироваться в зависимости от задаваемых параметров. Например, определим