Как отсортировать массив по возрастанию c
Перейти к содержимому

Как отсортировать массив по возрастанию c

  • автор:

Отсортировать массив по возрастанию

Задание — «Создайте класс с именем student, содержащую поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов). Создать массив из десяти элементов такого типа, упорядочить записи по возрастанию среднего балла. Добавить возможность вывода фамилий и номеров групп студентов, имеющих оценки, равные только 4 или 5.» В процессе выполнения застопорился на моменте, где надо упорядочить по возрастанию среднего балла, т.е. сам средний балл найден, а вот как отсортировать — без понятия, всё что ни пробовал — мимо.

#include #include using namespace std; class student < public: string fullname; int gnumber; int marks[5]; >; int main() < setlocale(LC_ALL, "rus"); const int size = 5; student arr[size]; //ввод for (int i = 0; i < size; i++) < cout > arr[i].fullname; cout > arr[i].gnumber; cout > arr[i].marks[j]; > cout //сортировка double avg[size]; double sum; for (int i = 0; i < size; i++) < sum = 0; for (int j = 0; j < 5; j++) < sum += arr[i].marks[j]; avg[i] = sum / 5; >cout << avg[i] for (int i = 0; i < size - 1; ++i) < if (avg[i] >avg[i + 1]) < swap(arr[i], arr[i + 1]); >> //вывод упорядоченного for (int i = 0; i < size; i++) < cout cout

Отслеживать
задан 8 мая 2021 в 20:53
bruhmomentum bruhmomentum
59 1 1 серебряный знак 9 9 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Ваша проблема в том, что вы сравниваете данные из массива avg, который судя по тому, что я понял соответствует массиву arr, но после сравнения делаете swap только массива arr. попробуйте делать swap как элементов массива arr, так и avg

Отслеживать
ответ дан 8 мая 2021 в 21:10
Chumachenko Mihail Chumachenko Mihail
78 6 6 бронзовых знаков

  • c++
  • массивы
  • классы
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.2.14.4854

Отсортировать массив по возрастанию

Author24 — интернет-сервис помощи студентам

Задан массив из 10 элементов, отсортировать его по возрастанию.
Помогите, пожалуйста .

Лучшие ответы ( 1 )

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

Ответы с готовыми решениями:

Отсортировать массив по убыванию, затем добавить недостающий элемент и отсортировать массив по возрастанию
2) В массиве a . a встречаются по одному разу все целые числа от 0 до n, кроме одного. За n.

отсортировать массив по возрастанию
#include <iostream.h> #include <stdlib.h> #include <stdio.h> #define N 10 БУДУ ПРЕМНОГО.

Отсортировать массив по возрастанию
Помогите пожалуйста написать программку! Заполнение динамического целочисленного массива длинной.

Отсортировать массив по возрастанию
подскажите пожалуйста #include <iostream> #include <iomanip> #include <ctime> using namespace.

52 / 60 / 24

Регистрация: 03.09.2010

Сообщений: 1,242

Лучший ответ

Сообщение было отмечено Роман Столяров как решение

Решение

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
#include using namespace std; int main() { const int size = 10; int arr[size]; // заполнение массива for (int i = 0; i  size; i++) { cout  <"arr["   <"] = "; cin >> arr[i]; } int temp; // временная переменная для обмена элементов местами // Сортировка массива пузырьком for (int i = 0; i  size - 1; i++) { for (int j = 0; j  size - i - 1; j++) { if (arr[j] > arr[j + 1]) { // меняем элементы местами temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // Вывод отсортированного массива на экран for (int i = 0; i  size; i++) { cout  [i]  <" "; } cout  ; return 0; }

Как отсортировать массив по возрастанию c

В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.
Стоит почитать Структуры данных

Модераторы: volvo877, Romtek

  • Математика (Работа с числами)
  • Сортировка - Библиотека алгоритмов

'> Как упорядочить массив по возрастанию? , Алгоритмы сортировки

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 09.04.04, 17:40

Рейтинг (т): 188
- Алгоритмы сортировки -

  1. метод выбора (SelectionSort)
  2. метод пузырька (BubbleSort)
  3. метод простых вставок (InsertionSort)
  4. метод бинарных вставок (BinaryInsertionSort)
  5. метод Шелла (ShellSort)
  6. метод Уильяма Флойда, бинарных деревьев (HeapSort)
  7. метод фон Неймана, слияний (NeumanSort)
  8. метод быстрой сортировки (QuickSort)

1) Сортировка массива по возрастанию методом выбора

Это наиболее естественный алгоритм упорядочивания. Допустим, что элементы a 0 , . a i-1 уже упорядочены, тогда среди оставшихся a i , . a n-1 находим минимальный элемент и меняем его местами с i-тым элементом. И так далее, пока массив не будет полностью упорядочен.

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure SelectionSort(var arr : array of Real; const N : Integer);
I : Integer;
J : Integer;
K : Integer;
for i:=1 to N do
for j:=i to n do
if m>Arr[j-1] then
Arr[k-1]:=Arr[i-1];

2) Сортировка массива по возрастанию (метод пузырька)

Последовательно просматриваем числа a 0 , . a n-1 находим наименьшее i такое, что a i > a i+1 . Поменять a i и a i+1 местами, возобновить просмотр с элемента a i+1 и т.д. Тем самым наибольшее число передвинется на последнее место. Следующие просмотры начинать опять сначала, уменьшая на единицу количество просматриваемых элементов. Массив будет упорядочен после просмотра, в котором участвовали только первый и второй элементы.

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure BubbleSort(var Arr : array of Real; const N : Integer);
I : Integer;
J : Integer;
for i:=Pred(N) downto 1 do
for j:=0 to Pred(i) do
if Arr[j]>=Arr[j+1] then
Сообщение отредактировано: Romtek - 08.10.10, 20:04
Сообщ. #2 , 09.04.04, 18:21

Рейтинг (т): 188

3) Сортировка массива по возрастанию (метод простых вставок)

Последовательно просматриваем a 1 , . a n-1 и каждый новый элемент a i вставляем на подходящее место в уже упорядоченную совокупность a i-1 , . a 1 . Это место определяется последовательным сравнением a i с упорядоченными элементами a 0 , . a i-1 .

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure InsertionSort(var Arr : array of Real; N : Integer);
I : Integer;
J : Integer;
K : Integer;
if Arr[i]<=Arr[j] then until not(k>j);
until not(jВ связи с многочисленными просьбами добавляю реализацию метода простых вставок без циклов с пост-условием:

procedure InsertionSort(var Arr: array of real; n: integer);
i, j: integer;
for i := 0 to n - 1 do begin
while (j >= 0) and (T < Arr[j]) do begin Arr[j + 1] := Arr[j]; Arr[j + 1] := T;

4) Сортировка массива по возрастанию (метод бинарных вставок)

Этот алгоритм представляет из себя оптимизированную версию предыдущего, отличие заключается в том, что при поиске место, на которое надо вставить элемент a i в уже упорядоченную совокупность a 0 , . a i-1 , определяется алгоритмом деления пополам (отсюда и название алгоритма "бинарные вставки" здесь понимаем как "вставка делением пополам").

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure BinaryInsertionSort(var Arr : array of Real; N : Integer);
B,C,E,I,J,K : Integer;
while b<>c do
if Arr[c-1]>Arr[i-1] then e:=c
if Arr[b-1]Arr[e-1]
while k>b do
Arr[k-1]:=Arr[k-1-1];
until not(i<=n); Сообщение отредактировано: volvo877 - 29.04.08, 07:30
Сообщ. #3 , 09.04.04, 19:03

Рейтинг (т): 188

5) Сортировка массива методом Шелла

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure ShellSort(var Arr : array of Real; N : Integer);
C : Boolean;
E : Integer;
G : Integer;
I : Integer;
J : Integer;
if Arr[j]<=Arr[j+g] then c:=False until not((j>=0)and(C));
until not(i<=n); until not(g>0);

6) Сортировка массива по возрастанию (метод Уильяма Флойда, бинарных деревьев)

Алгоритм основан на представлении массива в виде бинарного дерева, обладающего особыми свойствами. В памяти компьютера все элементы массива расположены последовательно, структура же дерева определяется следующим образом: будем считать, что i-ый элемент массива ("предок") имеет два элемента потомка с номерами 2i+1 и 2i+2. Дерево имеет нормальную форму, если любой элемент предок больше своих потомков.

Из свойств алгоритма стоит заметить, что он дает стабильно хорошую скорость упорядочивания (порядка n*log(n)), вне зависимости от того с каким массивом работает, и поэтому используется в случаях когда необходимо гарантировано упорядочить массив за короткое время.

Процедура для сортировки массива.
*массив значений a с индексами элементов от 0 до N-1
*число элементов N
procedure HeapSort(var Arr : array of Real; N : Integer);
I,J,K,T : Integer;
while t<>1 do
if Arr[k-1]>=Arr[t-1] then t:=1
Arr[k-1]:=Arr[t-1];
until not(i<=n); while t<>0 do
if k>i then t:=0
if kArr[k-1] then inc(k);
if Arr[t-1]>=Arr[k-1] then t:=0
Arr[k-1]:=Arr[t-1];
until not(i>=1);
Сообщ. #4 , 09.04.04, 20:20

Рейтинг (т): 188

7) Сортировка массива по возрастанию (метод фон Неймана, слияний)

Алгоритм фон Неймана упорядочивания массива (алгоритм сортировки слияниями) основан на многократных слияниях уже упорядоченных групп элементов массива. Вначале весь массив рассматривается как совокупность упорядоченных групп по одному элементу в каждой. Слиянием соседних групп получаем упорядоченные группы, каждая из которых содержит два элемента (кроме, возможно, последней группы которой не нашлось парной). Далее, упорядоченные группы укрупняются тем же способом и т.д.

Алгоритм дает хорошие показатели по скорости работы, даже в сравнении с сортировкой методом бинарных деревьев. Единственный недостаток - необходимость использовать дополнительный массив того же размера.

Язык Си в примерах/Сортировка

Задача «сортировки» (упорядочения) — одна из первых интересных и сложных задач теории алгоритмов. Общие принципы освещает статья «Алгоритмы сортировки», здесь же мы рассматриваем способы упорядочения посредством языка Си.

  • 1 Метод «пузырька»
  • 2 Функция qsort из библиотеки stdlib
  • 3 Динамическое выделение памяти
  • 4 Программа упорядочения строк в алфавитном порядке
  • 5 Примечания

Метод «пузырька» править

Один из простейших алгоритмов решения — метод «пузырька».

#include int main()  int n, i, j; scanf_s("%d", &n); int a[n]; // считываем количество чисел n // формируем массив n чисел for(i = 0 ; i  n; i++)  scanf_s("%d", &a[i]); > for(i = 0 ; i  n - 1; i++)  // сравниваем два соседних элемента. for(j = 0 ; j  n - i - 1 ; j++)  if(a[j] > a[j+1])  // если они идут в неправильном порядке, то // меняем их местами. int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp; > > > > 

Понятно, что после первого «пробега» самый большой элемент массива окажется на последнем месте. После второго пробега мы будем уверены, что второй по величине элемент находится на предпоследнем месте.

Задача: Докажите, что достаточно n − 1 пробега, чтобы элементы массива упорядочились.

Решив эту задачу, вы докажете, что метод «пузырька» решает задачу сортировки.

Функция qsort из библиотеки stdlib править

Два оператора for, в которых происходит сортировка, можно заменить на одну строку:

qsort(a, n, sizeof(int), cmp ); 

Это функция, описанная в стандартной библиотеке ANSI C и объявлена в заголовочном файле stdlib.h.

Поэтому в начале программы нужно добавить

#include

Функцией qsort можно упорядочивать объекты любой природы. По сути, она предназначена упорядочивать множества блоков байтов равной длины. Второй аргумент функции — это число таких блоков, третий аргумент — длина каждого блока. Первый аргумент — это адрес, где находится начало первого блока (предполагается, что блоки в памяти расположены друг за другом подряд).

Четвёртый аргумент функции qsort — это имя функции, которая умеет сравнивать два элемента массива. В нашем случае это

int cmp(const void *a, const void *b)  return *(int*)a - *(int*)b; > 

В силу указанной универсальности функции сортировки, функция сравнения получает в качества аргумента адреса двух блоков, которые нужно сравнить и возвращает 1, 0 или -1:

положительное значение, если a > b 0, если a == b отрицательное значение, если a < b

Поскольку у нас блоки байт -- это целые числа (в 32-битной архитектуре это четырёхбайтовые блоки), то необходимо привести данные указатели типа (const void*) к типу (int *) и осуществляется это с помощью дописывания перед указателем выражения «(const int*)». Затем нужно получить значение переменной типа int, которая лежит по этому адресу. Это делается с помощью дописывания спереди звездочки.

Таким образом, мы получили следующую программу

#include #include #define N 1000 int cmp(const void *a, const void *b)  return *(int*)a - *(int*)b; > int main()  int n, i,j; int a[N]; scanf("%d", &n); for(i = 0 ; i  n; i++)  // ЧИТАЕМ ВХОД scanf("%d", &a[i]); > qsort(a, n, sizeof(int), cmp ); // СОРТИРУЕМ for(i = 0 ; i  n; i++)  // ВЫВОДИМ РЕЗУЛЬТАТ printf("%d ", a[i]); > return 0; > 

Динамическое выделение памяти править

Ниже приведена программа, где память под массив выделяется динамически:

#include #include #include int cmp(const void *a, const void *b)  return *(int*)a - *(int*)b; > int main()  int n, i; int *a; scanf("%d", &n); a = (int*) malloc(sizeof(int)*n); for(i = 0 ; i  n; i++)  scanf("%d", &a[i]); > qsort(a, n, sizeof(int), cmp ); for(i = 0 ; i  n; i++)  printf("%d ", a[i]); > free(a); return 0; > 

Функция malloc (от англ. memory allocation --- выделение памяти) делает запрос к ядру операционной системы по выделению заданного количества байт. Единственный аргумент этой функции — число байт, которое вам нужно. В качестве результата функция возвращает указатель на начало выделенной памяти. Указатель на начало выделенной памяти &mbsah — это адрес ячейки памяти, начиная с которого идут N байт, которые вы можете использовать под любые свои нужды. Всю память, которая была выделена с помощью функции malloc, нужно освобождать с помощью функции free. Аргумент функции free — это указатель на начало выделенной когда-то памяти.

Программа упорядочения строк в алфавитном порядке править

#include #include #include #define N 100 #define M 30 int main(int argc, char* argv[])  char a[N][M]; int n, i; scanf("%d", &n); for (i=0; in; i++) scanf("%s", &a[i]); qsort(a, n, sizeof(char[M]), (int (*)(const void *,const void *)) strcmp); for (i=0; in; i++) printf("%s\n", a[i]); return 0; > 

Обратите внимание на сложное приведение типов.

Функция strcmp, объявленная в файле string.h имеет следующий прототип:

int strcmp(const char*, const char*);

То есть функция получает два аргумента -- указатели на кусочки памяти, где хранятся элементы типа char, то есть два массива символов, которые не могут быть изменены внутри функции strcmp (запрет на изменение задается с помощью модификатора const) [1] .

В то же время в качестве четвертого элемента функция qsort хотела бы иметь функцию типа

int cmp(const void*, const void*);

В языке Си можно осуществлять приведение типов являющихся типами функции. В данном примере тип

int (*)(const char*, const char*); // функция, получающая два элемента типа 'const char *' и возвращающая элемент типа 'int'

приводится к типу

int (*)(const void*, const void*); // функция, получающая два элемента типа 'const void *' и возвращающая элемент типа 'int'

Примечания править

  1. ^ Функция strcmp в соответствии с описанием, выдаваемым командой man 3 strcmp, осуществляет сравнение двух строк и определяет, какая из двух строк идёт первой в алфавитном порядке (сравнивает две строки в лексикографическом порядке), а именно: она возвращает значение больше нуля, если первая строка "больше" второй (идёт после второй в алфавитном порядке), 0 – если они совпадают, и значение меньше нуля– если первая строка "меньше" второй.

Последний раз редактировалась 20 декабря 2020 в 14:02

Языки

Эта страница недоступна на других языках.

  • Эта страница в последний раз была отредактирована 20 декабря 2020 в 14:02.
  • Если не указано иное, содержание доступно по лицензии CC BY-SA 4.0.
  • Политика конфиденциальности
  • Описание Викиучебника
  • Отказ от ответственности
  • Кодекс поведения
  • Разработчики
  • Статистика
  • Заявление о куки
  • Условия использования
  • Настольная версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *