Язык Си в примерах/Сортировка: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
м {{BookCat}}; избыточные <big /> и <font /> вокруг <source />; ссылки; пробелы.
Строка 6:
Один из простейших алгоритмов решения — «метод пузырька».
<big><source lang="c">
#include<stdio.h>
#define N 1000
Строка 30:
}
}
</source></big>
 
Понятно, что после первого «пробега» самый большой элемент массива окажется на последнем месте
(он и был тем самым «пузырьком», который всплыл).
После второго пробега мы будем уверены, что второй по величине элемент
находится на предпоследнем месте.
Строка 60:
два элемента массива. В нашем случае это
 
<big><source lang="c">
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
</source></big>
 
В силу указанной универсальности функции сортировки, функция сравнения получает в качества аргумента адреса двух блоков, которые нужно сравнить и возвращает 1, 0 или -1:
Строка 78:
Таким образом, мы получили следующую программу
 
<big><source lang="c">
#include <stdio.h>
#include <stdlib.h>
Строка 98:
return 0;
}
</source></big>
 
== Динамическое выделение памяти ==
Строка 104:
Ниже приведена программа, где память под массив выделяется динамически:
 
<big><source lang="c">
#include <stdio.h>
#include <stdlib.h>
Строка 127:
return 0;
}
</source></big>
 
Функция <tt>malloc<tt> (от англ. ''memory allocation'' --- ''выделение памяти'') делает запрос к ядру операционной системы по выделению заданного количества байт. Единственный аргумент этой функции &mdash; число байт, которое вам нужно. В качестве результата функция возвращает указатель на начало выделенной памяти. Указатель на начало выделенной памяти &mbsah — это адрес ячейки памяти, начиная с которого идут N байт, которые вы можете использовать под любые свои нужды. Всю память, которая была выделена с помощью функции <tt>malloc<tt>, нужно освобождать с помощью функции <tt>free</tt>. Аргумент функции <tt>free</tt> — это указатель на начало выделенной когда-то памяти.
 
== Программа упорядочения строк в алфавитном порядке ==
<big><source lang="c">
#include <stdlib.h>
#include <string.h>
Строка 149:
return 0;
}
</source></big>
 
Обратите внимание на сложное приведение типов.
Строка 164:
int cmp(const void*, const void*);
 
В языке Си можно осуществлять приведение типов являющихся типами функции. В данном примере тип
 
int (*)(const char*, const char*); // функция, получающая два элемента типа 'const char *' и возвращающая элемент типа 'int'
 
приводится к типу
 
int (*)(const void*, const void*); // функция, получающая два элемента типа 'const void *' и возвращающая элемент типа 'int'
Строка 176:
#{{note|strcmp}} Функция <tt>strcmp</tt> в соответствии с описанием, выдаваемым командой <tt>man 3 strcmp</tt>, осуществляет сравнение двух строк и определяет, какая из двух строк идёт первой в алфавитном порядке (сравнивает две строки в лексикографическом порядке), а именно: она возвращает 1, если первая строка "больше" второй (идёт после второй в алфавитном порядке), 0 &ndash; если они совпадают, и -1 &ndash; если первая строка "меньше" второй.
 
 
[[Категория:Алгоритмы сортировки]]
{{BookCat}}
[[Категория:Язык Си в примерах|Сортировка]]