Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461

Сортировка массивов

08.10.2011, 11:46. Показов 3937. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Делаю задание из учебника Дейтелов.
Задания:
7.11. (Пузырьковая сортировка) В алгоритме пузырьковой сортировки меньшие
значения постепенно «всплывают» к началу массива подобно пузырькам в воде, в то
время как большие значения опускаются «на дно». Пузырьковая сортировка
выполняет несколько проходов по массиву. На каждом проходе сравниваются пары
смежных элементов. Если порядок элементов в паре восходящий (или элементы
идентичны), мы оставляем их так, как есть. Если порядок элементов
нисходящий, их значения в массиве обмениваются. Напишите программу,
сортирующую массив из 10 целых чисел посредством пузырьковой сортировки.
7.12. Пузырьковая сортировка, представленная в упражнении 7.11, неэффективна
для больших массивов. Выполните следующие простые модификации для
улучшения эффективности пузырьковой сортировки.
a) После первого прохода наибольшее число гарантированно окажется в
элементе массива с наивысшим номером; после второго прохода «на месте» окажутся
два наибольших числа и так далее. Модифицируйте пузырьковую сортировку
так, чтобы вместо выполнения девяти сравнений на каждом проходе на
втором проходе было восемь сравнений, на третьем проходе — семь и так далее.
b) Данные в массиве могут уже находиться в необходимом порядке, либо
близком к нему, так зачем же делать девять проходов, если достаточно сделать
меньше? Модифицируйте сортировку так, чтобы в конце каждого прохода
проверялось, были ли сделаны какие-либо перестановки. Если не было ни
одной, значит, данные уже находятся в соответствующем порядке, так что
программа должна завершиться. Если перестановки были сделаны, нужно
сделать, по меньшей мере, еще один проход.


Первое сделал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template< typename T >
void swap( T &x, T &y )
{
    T temp = x;
    x = y;
    y = temp;
}
 
template< typename T >
void arrSort( T arr[], const long long &size )
{
    for ( int i = 0; i < size; i++ )
        for ( int j = 1; j < size; j++ )
            if ( arr[ j ] < arr[ j - 1 ] )
                swap ( arr[ j ], arr[ j - 1 ] );
}
Из второго задания часть а.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template< typename T >
void arrSort( T arr[], const long long &size )
{
    int max;
    int temp = size - 1;
 
    for ( int i = 0; i < size; i++, temp-- )
    {
        max = 0;
 
        for ( int j = 0; j <= temp; j++ )
            if ( arr[ j ] > arr[ max ] )
                max = j;
 
        swap ( arr[ max ], arr[ temp ] );
    }
}
Не могу понять, как сделать часть b. Подскажите, пожалуйста. И поправьте если я что не так сделал в предыдущих. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2011, 11:46
Ответы с готовыми решениями:

Сортировка массивов по убыванию и замена массивов
Задача: Даны два массива: А3 и В3х3. Массив А упорядочить по убыванию и заменить им первую строку матрицы В. Где-то раньше у вас был...

Обработка одномерных массивов. Сортировка массивов
Здравствуйсте! Помогите пожалуйста написать программу! В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1)...

Обработка одномерных массивов. Сортировка массивов
Здравствуйте, помогите пожалуйста решить задачу легким способом. В одномерном массиве, состоящем из n вещественных элементов, вычислить: ...

10
20 / 20 / 4
Регистрация: 06.10.2011
Сообщений: 53
08.10.2011, 12:24
Вот как-то так:
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
08.10.2011, 12:26
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void arrSort( T arr[], const long long &size )
{
           int flag = 1;
           while (flag)
           {
                   flag = 0;
                   for ( int j = 1; j < size; j++ )
                        if ( arr[ j ] < arr[ j - 1 ] )
                        {
                                swap ( arr[ j ], arr[ j - 1 ] );
                                flag = 1;
                        }
           }
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.10.2011, 12:30
Toshkarik, почитайте здесь Алгоритмы сортировок
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
08.10.2011, 12:35  [ТС]
Thinker, Спасибо, я опять задание не правильно понял, думал, что нужно к а) прибавить б). Оказывается это две разные модификации.

-=ЮрА=-, Спасибо, но я видел это. Когда делаешь сам, лучше усваивается.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
08.10.2011, 13:52
Цитата Сообщение от Toshkarik Посмотреть сообщение
И поправьте если я что не так сделал в предыдущих
Цитата Сообщение от Toshkarik Посмотреть сообщение
void arrSort( T arr[], const long long &size )
Для работы с массивами есть специальный тип size_t, использовать long long для указания размера массива неверно. Плюс ко всему ты ещё и сравниваешь переменную типа long long с переменной типа int внутри функции... И нет особого смысла делать парметр встроенного типа константной ссылкой.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
08.10.2011, 14:10  [ТС]
rangerx, по поводу size_t, разве это относится к С-массивам? Вроде как я понял это к векторам, в любом случае в книги данный вопрос слегка был затронут на небольшом ознакомлении с классом vector. А по поводу long long, спасибо, и в правду что то сглупил. Где то увидел в примере long long или просто long и решил написать так же.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
08.10.2011, 14:40
Дело не в том массив это или вектор. Подробнее смотри здесь.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
08.10.2011, 16:28
Toshkarik, ваша реализация под буквой a - сортировка прямым выбором в чистом виде. Имелось вот что в виду:

C++
1
2
3
4
5
6
7
8
9
10
11
void arrSort( T arr[], const long long &size )
{
       int r = size; 
       for ( int i = 0; i < size; i++ )
       {
                for ( int j = 1; j < r; j++ )
                        if ( arr[ j ] < arr[ j - 1 ] )
                                swap ( arr[ j ], arr[ j - 1 ] );
                r--;
       }
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
08.10.2011, 17:43  [ТС]
rangerx, спасибо большое, более-менее понятно.

Thinker, получается просто нужно декрементировать переменную в условии цикла? В этом вся "модификация"?
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
08.10.2011, 18:07
Цитата Сообщение от Toshkarik Посмотреть сообщение
Thinker, получается просто нужно декрементировать переменную в условии цикла? В этом вся "модификация"?
Именно так.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2011, 18:07
Помогаю со студенческими работами здесь

Сортировка массивов
Здравствуйте! Необходимо заполнить 8 массивов с клавиатуры и выполнить их сортировку методом пузырька. Как это можно реализовать? Только...

Сортировка 2-х массивов
Вопрос очень простой, я забыл как из 2-х массивов получить 3-ий, что бы в нём присутствовали только элементы первого массива. Т.е. что бы...

Сортировка массивов
Добрый день. Помогите, пожалуйста разобраться с задачей: Дан массив случайных чисел в диапазоне от -20 до +20 (из 20 элементов)....

Сортировка массивов
Есть две переменные X и Y, они моут быть как положительные так и отрицательные, каждому положению x и y пренадлежит одна структура из...

Сортировка массивов
Помогите, пожалуйста, отсортировать 5 массивов методом пузырька


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru