Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция.docx
Скачиваний:
37
Добавлен:
28.03.2016
Размер:
2.79 Mб
Скачать

7. Сортировка целочисленного массива методом пузырьковой сортировкой.

Программа (см. ниже) сортирует значения массива а из 10 элементов в возрастающем порядке. Используемая при этом техника получила название пузырьковая сортировка или сортировка погружением, потому что наименьшее значение постепенно «всплывает», продвигаясь к вершине (началу) мас­сива, подобно пузырьку воздуха в воде, тогда как наибольшее значение по­гружается на дно (конец) массива. Этот прием требует нескольких проходов по массиву. При каждом проходе сравнивается пара следующих друг за дру­гом элементов. Если пара расположена в возрастающем порядке или элементы одинаковы, то мы оставляем значения как есть. Если же пара расположена в убывающем порядке, значения меняются местам в массиве.

Сначала программа сравнивает a[0] и a[l], затем a[l] и a[2], потом a[2] и a[3] и т.д. до тех пор, пока проход не закончится сравнением a[8] и a[9]. Хотя элементов 10, производится только девять сравнений. При выбранном способе последовательных сравнений большое значение может перемещаться в массиве вниз на много позиций за один проход, но малое значение может быть передвинуто вверх только на одну позицию. При первом проходе наибольшее значение гарантированно опустится на место нижнего элемента массива a[9]. При втором проходе второе наибольшее значение гарантированно опустится на место a[8]. При девятом проходе девятое наибольшее значение опустится на место a[l]. Это оставляет наименьшему значению место a[0], так что для сортировки массива из 10 элементов нужно только девять проходов.

Сортировка выполняется с помощью вложенного цикла for. Если необ­ходима перестановка, она выполняется тремя присваиваниями

hold = а [i]; a[i] = a[i + 1]; a[i + 1] = hold;

где дополнительная переменная hold временно хранит одно из двух перестав­ляемых значений. Перестановку нельзя выполнить двумя присваиваниями

a[i] = a[i + 1]; a[i + 1] = a[i];

Если, например, a[i] равно 7, а a[i + 1] равно 5, то после первого при­сваивания оба значения будут 5, а значение 7 будет потеряно. Следовательно, необходима дополнительная переменная hold.

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

// Эта программа сортирует значения массива в возрастающем порядке

#include <iostream.h>

#include <iomanip.h>

main() {

const int arraySize = 10;

int a[arraySize] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37};

int hold;

cout << "Элементы данных в исходном порядке" << endl;

for (int і = 0; і < arraySize; і++)

cout << setw(4) << a[i];

for (int pass = 1; pass < arraySize; pass++) // проход

for (і = 0; і < arraySize - 1; і++) // один проход

if (a[i] > a[i + 1]) { // одно сравнение

hold = a[i]; // одна перестановка

a[i] = a[i + 1];

а[і + 1] = hold;

}

cout <<endl << "Элементы данных в порядке возрастания " << endl;

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

cout << setw(4) << a[i];

cout << endl; return 0;

}

Идентификатор массива является константным указателем на его нулевой элемент. Например, для массива из предыдущего листинга имя b – это то же самое, что &b[0], а к 1-му элементу массива можно обратиться, используя выражение *(b+i). Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель. Следующий фрагмент программы копирует все элементы массива а в массив b:

int a[100], b[100];

int *pa = а; // или int *p = &a[0];

int *pb = b;

for (int i = 0; i<100; i++)

*pb++ = *pa++; // или pb[i] = pa[i];