Отсортируйте первую половину массива по возрастанию, а вторую по убыванию - C (СИ)
Формулировка задачи:
Решите задачи данной группы, оформив решение в виде процедур генерации,
вывода и обработки массивов. Предусмотрите в процедуре генерации
массива ввод границ диапазона случайных чисел.
Создайте целочисленный массив, содержащий 2n различных чисел.
Отсортируйте первую половину массива по возрастанию, а вторую по
убыванию. Выведите на экран, отсортированный таким образом массива
Решение задачи: «Отсортируйте первую половину массива по возрастанию, а вторую по убыванию»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void isort(int* _f, int* _l, int (*pcmp)(int, int));
void array_print(FILE* _out, const int* _f, const int* _l);
int cmp_asc(int a, int b) { return (a < b); }
int cmp_desc(int a, int b) { return (a > b); }
int main(void){
int a[10];
int i, n = 10;
for(i = 0; i < n; ++i)
a[i] = rand() % 10;
array_print(stdout, a, a + n);
isort(a, a + (n / 2), &cmp_asc);
isort(a + (n / 2), a + n, &cmp_desc);
array_print(stdout, a, a + n);
return 0;
}
//сортировка вставкой
void isort(int* _f, int* _l, int (*pcmp)(int, int)){
int* p, *i, v;
if(_f >= _l)
return;
for(p = _f + 1; p != _l; ++p){
v = *p;
i = p - 1;
while((i >= _f) && (*pcmp)(v, *i)){
*(i + 1) = *i;
--i;
}
*(i + 1) = v;
}
}
//печать
void array_print(FILE* _out, const int* _f, const int* _l){
for(; _f != _l; ++_f)
fprintf(_out, "%d ", *_f);
fputc('\n', _out);
}
Объяснение кода листинга программы
- Создается массив из 10 элементов, заполненный случайными числами от 0 до 9.
- Функция array_print выводит массив на экран.
- Первая половина массива сортируется по возрастанию с помощью функции isort и сравнения a < b.
- Вторая половина массива сортируется по убыванию с помощью функции isort и сравнения a > b.
- Функция array_print снова выводит массив на экран.
- В конце программы возвращается 0, что означает успешное выполнение. В функции isort используется сортировка вставкой. Она проходит по массиву с начиная с первого элемента до последнего, каждый раз сравнивая текущий элемент с предыдущим. Если текущий элемент меньше предыдущего, они меняются местами. Эта процедура повторяется до тех пор, пока массив не будет полностью отсортирован. Функция array_print принимает указатель на файл, в который нужно вывести массив, и два указателя на начало и конец массива. Она проходит по всем элементам массива и выводит их на экран, добавляя пробел после каждого элемента. После вывода всех элементов она добавляет символ новой строки.