Включить элемент в упорядоченный по убыванию массив, не нарушая упорядоченности - C (СИ)
Формулировка задачи:
Задан упорядоченный по убыванию массив F=F(i), i=1,2,...N. Включить число Z в массив F, не нарушая упорядоченности. Вывести полученный массив F=F(i), i=1,2,...,N+1
Решение задачи: «Включить элемент в упорядоченный по убыванию массив, не нарушая упорядоченности»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- //Задан упорядоченный по убыванию массив F=F(i), i=1,2,...N. Включить число Z
- //в массив F, не нарушая упорядоченности. Вывести полученный массив F=F(i), i=1,2,...,N+1
- void Sort_on_decrease(int *p, int N)//сортирует по убыванию,N-размер массива
- {
- int i, j, max, x;
- for(i = 0; i < N - 1; ++i){
- max = i;
- for(j = i + 1; j < N; ++j){
- if(p[j] > p[max])
- max = j;
- }
- if(max != i){
- x = p[i]; p[i] = p[max];
- p[max] = x;
- }
- }
- }
- int binary_search(int *p, int R, int Z)//бинарный поиск,возвращает индекс элемента,на место
- { //которого нужно вставить введенный с клавиатуры элемент,R-размер массива,Z-введенное число
- --R;
- int L = 0, mid;
- while(L < R){
- mid = (L + R) / 2;
- if(p[mid] == Z){
- break;
- }
- else{
- if((p[mid] < Z))
- R = mid - 1;
- else
- L = mid + 1;
- }
- if(R - L <= 8){
- while(p[R] < Z)
- --R;
- mid = R + 1;
- break;
- }
- }
- return mid;
- }
- int main()
- {
- int i, j, bs, N, Z, *p;
- puts("Input array size:");
- if(!scanf("%d", &N)){
- fprintf(stderr,"%s\n", "Incorrect input!");
- exit(1);
- }
- p = malloc((N + 1) * sizeof p);
- if(p == NULL){
- fprintf(stderr,"%s\n", "Memory allocation error!");
- exit(2);}
- for(i = 0; i < N; ++i)
- printf("%d ", p[i] = rand() % 1000);
- printf("\n");
- Sort_on_decrease(p, N);
- for(i = 0; i < N; ++i)
- printf("%d ", p[i]);
- printf("\n");
- puts("Input number Z:");
- if(!scanf("%d", &Z)){
- fprintf(stderr,"%s\n", "Incorrect input!");
- exit(3);
- }
- bs = binary_search(p, N, Z);
- for(i = N + 1, j = N; j >= bs; --i, --j)
- p[i] = p[j];
- p[bs] = Z;
- for(i = 0; i < N + 1; ++i)
- printf("%d ", p[i]);
- free(p);
- return 0;
- }
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки: stdlib.h для работы с массивами и scanf/printf для взаимодействия с пользователем.
- Затем определены две функции: Sort_on_decrease() и binary_search().
- Функция Sort_on_decrease() сортирует массив по убыванию с помощью алгоритма сортировки пузырьком.
- Функция binary_search() выполняет бинарный поиск в отсортированном массиве для нахождения места, на которое нужно вставить новый элемент.
- В функции main() сперва запрашивается размер массива, который будет заполнен случайными числами.
- Затем массив заполняется случайными числами, сортируется по убыванию и выводится на экран.
- После этого пользователю предлагается ввести число, которое нужно вставить в массив.
- Функция binary_search() находит место для вставки этого числа в отсортированный массив.
- Затем, используя цикл, элементы массива сдвигаются вправо, чтобы освободить место для нового элемента.
- В конце новый элемент вставляется на найденное место, и весь массив выводится на экран.
- В конце программы освобождается память, выделенная под массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д