Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Задачи перестановок в массивахСодержание книги
Поиск на нашем сайте
Решение таких задач сводится к выбору алгоритма просмотра массива с целью выполнить требуемые перестановки. Пример 4. Дан одномерный целочисленный массив, заданный случайными числами на промежутке [-10; 10). Выполните циклический сдвиг элементов с нулевой позиции вправо на одну позицию. То есть должна быть реализована схема перестановок: x [0] ® x [1], x [1] ® x [2], …, x [ k -1] ® x [0]. Одним из алгоритмов такого циклического сдвига является следующая последовательность действий. Поместим в буфер последний элемент массива (buf=x[k-1]). Выполним смещение остальных элементов вправо на одну позицию (x[i]=x[i-1]). При этом важен порядок смещения: на освободившееся место последнего элемента перемещается предпоследний, на место предпоследнего – предшествующий ему и т.д. В результате таких перемещений освобождается место нулевого элемента, на которое перемещается элемент из буфера. В данной задаче целесообразно выполнить вывод массива дважды: до и после циклического сдвига. //Циклический сдвиг элементов в массиве с нулевой позиции на одну позицию вправо #include <stdio.h> #include <stdlib.h> #include <time.h> //подключение модуля для генератора случайных чисел #define max 100
void gen (int k, int a, int b,int x[max]); //прототип функции генерации массива void out (int k, int x[max]); //прототип функции вывода массива void sdvig (int k, int x[max]); //прототип функции циклического сдвига элементов массива
void main (){ int mas[max]; int n; do { printf("\nВведите количество элементов массива n (n<=100): "); scanf ("%d",&n); } while (n>max); gen(n,-10,10,mas); printf("Вывод сгенерированного массива из %d элементов: \n",n); out(n,mas); sdvig (n,mas); printf("\nВывод массива после циклического сдвига элементов: \n"); out(n,mas); } //Описание функции генерации массива с клавиатуры void gen(int k,int a, int b, int x[max]){ int i; srand(time(NULL)*1000); for (i=0;i<k;i++){ x[i]=int(rand()*1.0/(RAND_MAX)*(b-a)+a); } } //Описание функции вывода массива в строку void out (int k,int x[max]){ int i; for (i=0;i<k;i++) printf("%d ",x[i]); } //Описание функции циклического сдвига элементов массива void sdvig(int k,int x[max]){ int i,buf; buf=x[k-1]; for (i=k-1;i>0;i--) x[i]=x[i-1]; x[0]=buf; } Задания 1. Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ. 2. Дан одномерный целочисленный массив из N элементов, заданных с клавиатуры. Найти: количество и процентное соотношение положительных, отрицательных и нулевых элементов. 3. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [ a; b). Заменить все элементы массива, кратные 3, на третий элемент массива. 4. Дан одномерный вещественный массив из N элементов (N – нечетное), заданных случайными числами на промежутке [ a; b). Поменять местами элементы симметричные относительно центрального. Домашние задания 1. Наберите коды программ из Примеров 3 и 4. Выполните компиляцию и запуск программ. 2. Дан одномерный целочисленный массив из N элементов, заданных с клавиатуры. Найти: количество и процентное соотношение четных и нечетных значений элементов. 3. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [ a; b). Поменять местами первый минимальный и первый максимальный элементы. 4. Дан одномерный вещественный массив из N элементов, заданных случайными числами на промежутке [ a; b). Выполните циклический сдвиг элементов с n -ой позиции вправо на k позиций.
Лабораторная работа 30 Одномерные массивы: задачи сортировок элементов массива
Цель работы: изучить алгоритмы простейших сортировок и научиться решать задачи на их применение в одномерных массивах в языке C++.
Теоретические сведения Задача сортировки является такой же базовой, как задача поиска. В практических условиях эти задачи взаимосвязаны. Решению проблем, связанных с сортировкой, посвящено множество фундаментальных научных исследований, разработано множество алгоритмов. В общем случае сортировку следует понимать как процесс перегруппировки, заданного множества объектов в определенном порядке. Сортировка применяется для облегчения поиска элементов в упорядоченном множестве. Задача сортировки одна из фундаментных в программировании. Сортировка – это процесс перегруппировки заданного множества объектов в некотором установленном порядке. Сортировки массивов подразделяются по быстродействию. Существуют простые методы сортировок, которые требуют n*n сравнений, где n – количество элементов массива и быстрые сортировки, которые требуют n*ln(n) сравнений. Простые методы удобны для объяснения принципов сортировок, т. к. имеют простые и короткие алгоритмы. Усложненные методы требуют меньшего числа операций, но сами операции более сложные, поэтому для небольших массивов простые методы более эффективны. Простые методы подразделяются на три основные категории: · сортировка методом «пузырька» (простого обмена); · сортировка методом простого выбора (простой перебор); · сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг). Сортировка методом «пузырька» (простого обмена) Алгоритм попарного сравнения в литературе называют «методом пузырька», проводя аналогию с пузырьком, поднимающимся со дна бокала с газированной водой. По мере всплывания пузырек сталкивается с другими пузырьками и, сливаясь с ними, увеличивается в объеме. Чтобы аналогия стала очевидной, нужно считать, что элементы массива расположены вертикально друг над другом, и их нужно так упорядочить, чтобы увеличивались сверху вниз. Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает – массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции. /*Описание функции сортировки методом "пузырька" (простым обменом)*/ void BubbleSort (int k,int x[max]) { int i,j,buf; for (i=k-1;i>0;i--) for (j=0;j<i;j++) if (x[j]>x[j+1]) { buf=x[j]; x[j]=x[j+1]; x[j+1]=buf; } }
Сортировка методом простого выбора (простой перебор) Это наиболее естественный алгоритм упорядочивания. Шаги алгоритма: 1. находим минимальное значение в текущем списке 2. производим обмен этого значения со значением на первой неотсортированной позиции 3. теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы //Описание функции сортировки методом простого выбора void SelectionSort (int k,int x[max]) { int i,j,min,temp; for (i=0;i<k-1;i++) { //устанавливаем начальное значение минимального индекса min=i; //находим минимальный индекс элемента for (j=i+1;j<k;j++){ if (x[j]<x[min]) min=j; //меняем значения местами } temp=x[i]; x[i]=x[min]; x[min]=temp; } }
Сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг) Хотя этот метод сортировки намного менее эффективен, чем более сложные алгоритмы (такие как быстрая сортировка), у него есть ряд преимуществ: · прост в реализации · эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим · эффективен на наборах данных, которые уже частично отсортированы · это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы) · может сортировать список по мере его получения · не требует временной памяти, даже под стек На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. //Описание функции сортировки методом простого включения void InsertSort (int k,int x[max]) { int i,j, temp; for (i=0;i<k;i++) { //цикл проходов, i - номер прохода temp=x[i]; //поиск места элемента for (j=i-1; j>=0 && x[j]>temp; j--) x[j+1]=x[j];//сдвигаем элемент вправо, пока не дошли //место найдено, вставить элемент x[j+1]=temp; } }
Задания 1. Отсортируйте по возрастанию методом «пузырька» одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100). Выведите на экран исходный и отсортированный массивы. 2. Отсортируйте по возрастанию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы. 3. Отсортируйте по возрастанию методом простого включения одномерный целочисленный массив, заданный с клавиатуры. Выведите на экран исходный и отсортированный массивы. Домашние задания 1. Отсортируйте по убыванию методом простого обмена одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100). 2. Отсортируйте по убыванию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы. 3. Отсортируйте по убыванию методом простого включения одномерный целочисленный массив, заданный с клавиатуры. Выведите на экран исходный и отсортированный массивы. 4. Индивидуальное задание. Номер варианта определяется по журналу. Напишите программу, оформив её в виде функций генерации, вывода и обработки массивов. Предусмотрите ввод количества элементов массива и ввод границ диапазона случайных чисел с клавиатуры. Для решения задания используйте «однопроходные» алгоритмы, позволяющие получить результат после однократного просмотра массива. Варианты индивидуального задания
Лабораторная работа 31
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-09-13; просмотров: 486; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.110.145 (0.009 с.) |