Условно разделить массив A на отсортированную и несортированную части. К сортированной части сначала относится только первый элемент.
цикл по i от 2 до N с шагом 1 выполнять
// i – номер первого элемента в несортированной части
// массива
x:= A[i];
j := i – 1;
// Все элементы из отсортированной части, большие,
// чем x, сдвинуть на одну позицию вправо:
пока j>0 и A[j]>x выполнять
A[j+1] := A[j];
j := j – 1;
конец пока
// Элемент x поставить на свое место по порядку:
A[j+1] := x;
конец цикла
Метод 3(1). Сортировка простыми обменами (метод пузырька)
цикл по i от 2 до N с шагом 1 выполнять
// проход от конца массива к началу:
цикл по j от N до i с шагом -1 выполнять
// если два рядом стоящих элемента нарушают
// порядок по возрастанию, то их поменять местами.
если A[j] < A[j–1] то Обмен(j, j–1);
конец цикла
конец цикла
Метод 3(2). Сортировка простыми обменами (шейкерная сортировка)
Пусть F — логическая переменная, принимающая истинное значение, если во время прохода по массиву были обмены двух рядом стоящих элементов, left – левая граница несортированной части массива, а right – ее правая граница.
left := 1;
right := N;
F := истина;
пока F выполнять
F:= ложь;
i:= left;
//Проход по массивуот начала к концу:
пока i < right выполнять
если A[i] > A[i + 1]
то // переставить два рядом стоящих элемента,
// нарушающие порядок:
начало
Обмен (i, i+1);
F := истина;
конец
i := i + 1;
конец пока
// Сдвинуть правую границу влево на одну позицию:
right := right – 1;
// Если были обмены во время предыдущего прохода,
если F
то // совершить проход по массиву от конца
// к началу:
начало
F := ложь;
i:= right;
пока i > left выполнять
если A[i] < A[i – 1]
то// переставить рядом стоящие элементы,
// нарушающие порядок:
начало
Обмен (i, i–1);
F := истина;
конец
i := i – 1;
конец пока
конец
// Сдвинуть левую границу вправо на одну позицию:
left := left + 1;
конец пока // Цикл повторять до тех пор, пока F не
//останется равной значению ложь.
Метод 4. Сортировка подсчетом
Условно разделить массив A на отсортированную и несортированную части. Пусть i – номер первого элемента в несортированной части массива.
i := 1;
пока i < N выполнять
r:= 1;
// Посчитать количество элементов в массиве, меньших
// i-го элемента и записать это число в переменную r
цикл по j от 1 до N с шагом 1 выполнять
еслиA[i] > A[j]
то r := r + 1;
конец цикла
если r£ i // i-й элемент стоит на своем месте,
то // увеличить сортированную часть на 1 элемент
i := i + 1
иначе
начало
// вычислить позицию, куда нужно поставить
// i-й элемент:
покаA[r] = A[i]выполнять
r:= r+1
конец пока
// поменять его местами с тем элементом,
// который в этой позиции находится:
Обмен (r, i)
конец;
конец пока
Язык реализации – С.
Написать программу, которая сортирует массив целых чисел в порядке возрастания с помощью двух методов улучшенной сортировки.
Использовать следующие алгоритмы, описанные в [1, 2]:
1. быстрая сортировка,
2. один из алгоритмов по выбору:
§ сортировка методом Шелла,
§ пирамидальная сортировка.
Длина массива задается либо в программе константой, либо вводится с клавиатуры. Исходный массив заполняется программой с помощью датчика случайных чисел.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.