Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

5.1. Сортировка вставкой

На каждом шаге алгоритма сортировки вставкой выбирается один из элементов входных данных и вставляется в нужную позицию в уже отсортированном списке до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен. Можно использовать практически любой алгоритм выбора. Обычно с целью получения устойчивого алгоритма сортировки элементы вставляются по порядку их появления во входном массиве.

Листинг 5.1. Программа демонстрирует метод сортировки вставкой массива из 10 целых элементов.

//L5_1.cpp

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int A[10], n=10, i, j, key;

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

{

cout<<"Введите А("<<i+1<<")=";

cin>>A[i];

}

cout<<"Исходный массив\n";

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

cout<<A[i]<<" ";

cout<<endl;

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

{

key = A[i];

j = i - 1;

while (j >= 0 && A[j] > key)

{

A[j + 1] = A[j];

j = j - 1;

A[j + 1] = key;

}

}

cout<<"Полученный массив\n";

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

cout<<A[i]<<" ";

cout<<endl;

return 0;

}

Результат работы программы листинга 5.1 приведен на рис. 5.1:

Рис. 5.1. Результат работы программы листинга 5­.1

5.2. Метод пузырька

Алгоритм сортировки методом пузырька состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны. Это означает, что массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название данного алгоритма).

Листинг 5.2. Задан список студентов с указанием фамилии и номера группы. Упорядочить этот список по возрастанию номера группы, а внутри группы построить его в алфавитном порядке.

//L5_2.cpp

#include <string.h>

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int n, i,*grup, f, k=0, gtmp;

char **name, *ntmp, fam[30];

do

{

cout<<"Введите число студентов ";

cin>>n;

}while(n<=0);

name=new char*[n]; // Выделение памяти для указателей,

// связанных с фамилией студентов.

grup=new int[n]; // Выделение памяти под номера групп.

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

{

cout<<"Введите фамилию "<<i+1<<"-го студента и его группу ";

cin>>fam>>grup[i];

name[i]=strdup(fam); // Заполняется фамилия i-го студента

}

do

{

f=0;

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

//Сравнение по группам, а если они равны, сравнение фамилий:

if(grup[i]>grup[i+1] || (grup[i]==grup[i+1] && strcmp(name[i],name[i+1])>0))

{

ntmp=name[i];

name[i]=name[i+1];

name[i+1]=ntmp;

gtmp=grup[i];

grup[i]=grup[i+1];

grup[i+1]=gtmp;

f=1;

}

}while (f);

cout<<"Полученный список\n";

setlocale(LC_CTYPE,".866"); //Установка страницы для правильного

//вывода символов кириллицы.

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

{

cout.width(6); //Выделение поля для вывода группы

cout<<grup[i]<<" ";

cout<<name[i]<<'\n';

}

return 0;

}

На рис. 5.2 представлен результат выполнения программы листинга 5.2.

Рис. 5.2. Результат работы программы листинга 5­.2