Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_programmirovanie / Praktikum_programmirovanie.doc
Скачиваний:
65
Добавлен:
30.03.2015
Размер:
15.88 Mб
Скачать

Сортировка методом простого выбора

Чтобы упорядочить массив в возрастающем порядке, нужно выбрать наибольший элемент. Поскольку наибольший элемент нужно поставить в самый конец массива, его нужно поменять местами с последним элементом, даже если эти элементы идентичны. Теперь, игнорируя последний (наибольший) элемент массива, выполним поиск наибольшего элемента в оставшейся части массива и поменяем его местами с предпоследним элементом исходного массива. Этот процесс продолжается до тех пор, пока не будут найдены и переставлены n-l элемент из п элементов массива. Оставшийся элемент, стоящий первым, не нарушает порядок и поэтому не рассматривается.

На рис. показан пример сортировки методом выбора. Среди пяти целых чисел выбирается наибольшее - число 37, которое меняется местами с последним элементом массива - числом 13. (Числа, стоящие на правильных местах, выделены полужирным шрифтом. Затем среди оставшихся четырех чисел снова выбирается наибольшее - число 29, - которое меняется местами с предпоследним элементом - числом 13. Обратите внимание, что следующий выбор - число 14- уже стоит на правильном месте, однако алгоритм игнорирует этот факт и выполняет фиктивную перестановку числа 14 на одном и том же месте. В принципе намного эффективнее выполнять фиктивные перестановки, чем каждый раз проверять, нужна перестановка или нет. В заключение выбирается число 13, которое меняется местами со вторым элементом массива - числом 1о. Теперь массив упорядочен по возрастанию.

int i,max, n_max,j;

for(i=0;i<n-1;i++)

{

max=a[i]; n_max=i; //поиск максимального

for(j=i+1; j<n; j++)

if(a[j]>max)

{

max=a[j];

n_max=j;

}

a[n_max]=a[i]; //обмен

a[i]=max;

}

Постановка задачи

  1. Сформировать массив из n элементов с помощью датчика случайных чисел (n задается пользователем с клавиатуры).

  2. Распечатать полученный массив.

  3. Выполнить удаление указанных элементов из массива.

  4. Вывести полученный результат.

  5. Выполнить добавление указанных элементов в массив.

  6. Вывести полученный результат.

  7. Выполнить перестановку элементов в массиве.

  8. Вывести полученный результат.

  9. Выполнить поиск указанных в массиве элементов и подсчитать количество сравнений, необходимых для поиска нужного элемента.

  10. Вывести полученный результат.

  11. Выполнить сортировку массива указанным методом.

  12. Вывести полученный результат.

  13. Выполнить поиск указанных элементов в отсортированном массиве и подсчитать количество сравнений, необходимых для поиска нужного элемента.

  14. Вывести полученный результат.

При решении задач использовать псевдодинамические массивы.

Варианты

Вариант

Удаление

Добавление

Перестановка

Поиск

Сортировка

1

Максимальный элемент

К элементов в начало массива

Перевернуть массив

Первый четный

Простой обмен

2

Минимальный

элемент

К элементов в конец массива

Сдвинуть циклически на M элементов вправо

Первый отрицательный

Простой выбор

3

Элемент с заданным номером

N элементов, начиная с номера К

Сдвинуть циклически на M элементов влево

Элемент с заданным ключом (значением)

Простое включение

4

N элементов, начиная с номера K

Элемент с номером К

Поменять местами элементы с четными и нечетными номерами

Элемент равный среднему арифметическому элементов массива

Простой обмен

5

Все четные элементы

К элементов в начало массива

Четные элементы переставить в начало массива, нечетные - в конец

Первый четный

Простой выбор

6

Все элементы с четными индексами

К элементов в конец массива

Поменять местами минимальный и максимальный элементы

Первый отрицательный

Простое включение

7

Все нечетные элементы

N элементов, начиная с номера К

Положительные элементы переставить в начало массива, отрицательные - в конец

Элемент с заданным ключом (значением)

Простой обмен

8

Все элементы с нечетными индексами

Элемент с номером К

Перевернуть массив

Элемент равный среднему арифметическому элементов массива

Простой выбор

9

Все элементы больше среднего арифметического элементов массива

К элементов в начало массива

Сдвинуть циклически на M элементов вправо

Первый четный

Простое включение

10

Максимальный

элемент

К элементов в конец массива

Сдвинуть циклически на M элементов влево

Первый отрицательный

Простой обмен

11

Минимальный элемент

N элементов, начиная с номера К

Поменять местами элементы с четными и нечетными номерами

Элемент с заданным ключом (значением)

Простой выбор

12

Элемент с заданным номером

Элемент с номером К

Четные элементы переставить в начало массива, нечетные - в конец

Элемент равный среднему арифметическому элементов массива

Простое включение

13

N элементов, начиная с номера K

К элементов в начало массива

Поменять местами минимальный и максимальный элементы

Первый четный

Простой обмен

14

Все четные элементы

К элементов в конец массива

Положительные элементы переставить в начало массива, отрицательные - в конец

Первый отрицательный

Простой выбор

15

Все элементы с четными индексами

N элементов, начиная с номера К

Перевернуть массив

Элемент с заданным ключом (значением)

Простое включение

16

Все нечетные элементы

Элемент с номером К

Сдвинуть циклически на M элементов вправо

Элемент равный среднему арифметическому элементов массива

Простой обмен

17

Все элементы с нечетными индексами

К элементов в начало массива

Сдвинуть циклически на M элементов влево

Первый четный

Простой выбор

18

Все элементы больше среднего арифметического элементов массива

К элементов в конец массива

Поменять местами элементы с четными и нечетными номерами

Первый отрицательный

Простое включение

19

Максимальный элемент

N элементов, начиная с номера К

Четные элементы переставить в начало массива, нечетные - в конец

Элемент с заданным ключом (значением)

Простой обмен

20

Минимальный элемент

Элемент с номером К

Поменять местами минимальный и максимальный элементы

Элемент равный среднему арифметическому элементов массива

Простой выбор

Пример заполнения массива случайными числами

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

float a[100], b[100],buf;

int i,n, k, num, num_per;

cout << "Введите размерность массива n: " ;

cin >> n;

cout <<time(NULL)<<"\n";

srand(time(NULL));

for (i=1; i<=n; i++)

{a[i]=rand()%50;

cout << a[i] << "\n";

}

getch();

}

Пример выполнения задания

Удаление

Добавление

Перестановка

Все элементы, индекс которых кратен 3

После каждого 3 элемента вставить 1

Все элементы с индексами кратными 3 переставить в начало сохраняя порядок элементов в массиве

Программа на удаление элементов

В программе проверяется кратность трем индекса i элементов массива. Если i не делится на 3 без остатка (if ((i%3)!=0)), то мы записываем соответствующий элемент в массив В, в противном случае игнорируем элемент. Одновременно увеличиваем переменную k на единицу. k – индекс элементов для массива В. Когда цикл закончит свою работу в переменной k будет хранится количество перезаписанных элементов из массива А. Таким образом мы получим новый массив В, в котором будут отсутствовать элементы, чей индекс был кратен 3.

#include <iostream.h>

#include <conio.h>

#include <stdlib.h> //заголовочный файл для генерации случ. чисел

int main()

{

int a[100], b[100]; //описываем два массива из 100 элементов

int i,n, k;

cout << "Введите размерность массива n: " ;

cin >> n;

srand(time(NULL)); //задаем начальную точку отсчета для генерации случайных чисел

for (i=0; i<n; i++)

{a[i]=rand()%50; //генерация случайных чисел в диапазоне от 0 до 50

cout << a[i] << "\t"; //вывод полученных элементов на экран (\t – позволяет разделять элементы пробелами

}

cout<<"\n"; // переход на новую строку (\n)

k=0;

for (i=0;i<n;i++)

if ((i%3)!=0) //проверка индекса на кратность 3

{b[k]=a[i]; //перезаписываем нужные элементы в новый массив

k++;}

cout<<"\Новый массив\n"; //вывод нового массива

for (i=0; i<k; i++) cout << b[i] << "\t";

getch();

}

Схема алгоритма

Добавление элементов

В программе созданы два счетчика – k индекс элементов массива В, m – отсчитывает каждый третий элемент массива А. Как только m=3, в массив B записывается 1 и индекс k увеличивается на единицу. После этого m сбрасывается до нуля, чтобы отсчитывать следующую тройку элементов а[i]

int main()

{

int a[100], b[100]; //описываем два массива из 100 элементов

int i,n, k;

cout << "Введите размерность массива n: " ;

cin >> n;

srand(time(NULL)); //задаем начальную точку отсчета для генерации случайных чисел

for (i=0; i<n; i++)

{a[i]=rand()%50; //генерация случайных чисел в диапазоне от 0 до 50

cout << a[i] << "\t"; //вывод полученных элементов на экран

}

cout<<"\n";

k=0; m=0;

for (i=0;i<n;i++)

{

b[k]=a[i];

k++;m++;

if (m==3)

{ b[k]=1;

m=0;

k++;

}

}

cout<<"\Новый массив\n"; for (i=0; i<k; i++) cout << b[i] << "\t";

getch();

}

Перестановка

Сначала в новый массив В записываются элементы массива А с индексами кратными 3, затем уже все остальные

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

float a[100], b[100],buf;

int i,n, k, num, num_per;

cout << "введите размерность массива n: " ;

cin >> n;

srand(time(NULL));

for (i=0; i<n; i++)

{a[i]=rand()%50;

cout << a[i] << "\t";

}

k=0;

for (i=0; i<n; i++)

if (i%3==0) //если индекс кратен 3

{

b[k]=a[i]; //записать в массив В элемент с индексом кратным 3

k++; //увеличивается индекс массива В

}

for (i=0; i<n; i++)

if (i%3!=0) //если индекс не кратен 3

{

b[k]=a[i];

k++;

}

cout<<"\nНовый массив\n"; //Вывод нового массива

for (i=0; i<n; i++) cout << b[i] << "\t";

getch();

}