Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.03.2016
Сообщений: 39
1

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию

23.05.2016, 23:56. Показов 1884. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решите задачи данной группы, оформив решение в виде процедур генерации,
вывода и обработки массивов. Предусмотрите в процедуре генерации
массива ввод границ диапазона случайных чисел.
Создайте целочисленный массив, содержащий 2n различных чисел.
Отсортируйте первую половину массива по возрастанию, а вторую по
убыванию. Выведите на экран, отсортированный таким образом массива
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2016, 23:56
Ответы с готовыми решениями:

Отсортировать первую половину массива по возрастанию, а вторую - по убыванию
Массив из 20 целых чисел заполняется случайными числами от -100 до 100, отсортировать его первую...

Первую половину элементов массива упорядочить по убыванию, а вторую – по возрастанию
Из произвольного одномерного массива действительных чисел сформировать массив, в котором первую...

Отсортировать первую половину массива из N элементов по возрастанию, а вторую по убыванию
написать программу, которая отсортирует первую половину массива из N элементов по возрастанию, а...

Отсортировать первую половину списка по убыванию, вторую по возрастанию
Здравствуйте, форумчане. Есть структура: typedef struct list { int data; struct...

7
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
24.05.2016, 10:49 2
Первую половину элементов массива упорядочить по убыванию, а вторую – по возрастанию
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
24.05.2016, 11:39 3
HighPredator, Не сумел полностью разобраться в кодах по приведенной ссылке. Но хочу заметить, что для решения задачи вовсе не обязательно делать 2 сортировки. Достаточно сделать сортирующую функцию, которая анализирует сначала индексы элементов
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
24.05.2016, 11:44 4
Байт, если что они не мои Я просто хотел показать, что на форуме это 100500+ тема с такой (или аналогичной) формулировкой.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
25.05.2016, 22:51 5
Цитата Сообщение от HighPredator Посмотреть сообщение
если что они не мои Я просто хотел показать, что на форуме это 100500+ тема с такой (или аналогичной) формулировкой.
Да все понятно! Я их тоже видел достаточно. Но все с удивительным упорством разбивают массив на 2 части, и каждую отдельно сортируют. Что чрезвычайно глупо.
Как тут быть?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
26.05.2016, 10:39 6
Цитата Сообщение от Байт Посмотреть сообщение
Но все с удивительным упорством разбивают массив на 2 части, и каждую отдельно сортируют. Что чрезвычайно глупо.
Как тут быть?
С одной стороны соглашусь. С другой стороны, требуемая неоднородность выдаваемого результата автоматически дает больше одного вызова функции сортировки в общем случае. Я смог придумать только один чит и тот только для массива неотрицательных чисел: умножить первую половину на -1 до и после сортировки. Но это очень частный случай.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
 
#define N 10
 
int cmp(const void* a, const void* b)
{
  return (*(int*)a - *(int*)b);
}
 
int main(void)
{
  int a[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
  int i = 0;
 
  for (i = 0; i < N; i++) printf("%d ", a[i]);
  printf("\n");
 
  for (i = 0; i < N / 2; i++) a[i] = -1 * a[i];
 
  qsort(a, N, sizeof(int), cmp);
 
  for (i = 0; i < N / 2; i++) a[i] = -1 * a[i];
 
  for (i = 0; i < N; i++) printf("%d ", a[i]);
 
  return 0;
}
0
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
26.05.2016, 14:18 7
Лучший ответ Сообщение было отмечено СветланаХолод как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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);
}
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.05.2016, 22:05 8
Цитата Сообщение от HighPredator Посмотреть сообщение
С другой стороны
Да, используя qsort не получится. Так как вызываемая им сортировочная функция ничего не может знать о номерах элементов. Но сравнивая в main, никаких особых трудностей нет. В двух словах так:
Если i < n/2 < j, то элементы оставляем на месте. Если i, j < n/2, сортируем по первому принципу. i, j > n/2 - по второму.
Вот и вся премудрость
1
27.05.2016, 22:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2016, 22:05
Помогаю со студенческими работами здесь

Упорядочить первую половину списка натуральных чисел по убыванию, а вторую по возрастанию
Добрый вечер, начал разбираться в С, составил программу выводящую список случайных чисел, но к...

Отсортируйте первую половину массива по убыванию, а вторую по возрастанию
Дан массив А состоящий из 15 целых чисел. Отсортируйте первую половину массива по убыванию, а...

Отсортируйте первую половину массива по возрастанию, а вторую – по убыванию
Помогите решить задачу пожалуйста. Долго сижу и не могу сделать. Буду благодарен от всего сердца ;(...

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Дан массив с четным количеством элементов. Отсортируйте первую половину массива по возрастанию, а...

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Создайте целочисленный массив А, содержащий 10 различных чисел. Отсортируйте первую половину...

Массив: Отсортируйте первую половину массива по возрастанию, а вторую по убыванию...
Создайте массив,содержащий 20 различных целых чисел.Отсортируйте первую половину массива по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru