Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Очень хорошо по языку С. С++.DOC
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
931.33 Кб
Скачать

Глава 2. Примеры использования языка Си.

2.1. Сортировка.

Практически каждый алгоритм сортировки можно разбить на три части:

- сравнение, определяющее упорядоченность пары элементов;

- перестановку, меняющую местами пару элементов;

- собственно сортирующий алгоритм, который осуществляет сравнение и перестановку элементов до тех пор, пока все элементы множества не будут упорядочены.

М е т о д п у з ы р ь к а ( обменная сортировкой с выбором).

Идея этого метода отражена в его названии. Самые легкие элементы массива "всплывают" наверх, самые "тяжелые" - тонут. Алгоритмически это можно. Реализуется так - будем просматривать весь массив "снизу вверх" и менять стоящие рядом элементы в том случае, если "нижний" элемент меньше, чем "верхний". Таким образом, мы вытолкнем наверх самый "легкий" элемент всего массива. Теперь повторим всю операцию для оставшихся неотсортированными N-1 элементов (т.е. для тех, которые лежат "ниже" первого).

#include <stdio.h>

#define swap(a,b) { int tmp; tmp=a; a=b; b=tmp; }

main()

{

int a[10], dim=10;

int i, j;

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

{

printf("Элемент\n");

scanf("%d",&a[i]);

}

printf("Было\n");

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

printf("%d\n",a[i]);

/* Проход массива "вниз", начиная с нулевого элемента */

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

/* Проход массива "вверх", начиная с последнего до i-го элемента */

for (j = dim-1; j > i; j--)

/* Сравнение двух соседних элементов и их обмен */

if(a[j-1] > a[j]) swap(a[j-1], a[j]);

printf("Стало\n");

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

printf("%d\n",a[i]);

}

С о р т и р о в к а в ы б о р о м.

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

#include <stdio.h>

#define swap(a,b) { int tmp; tmp=a; a=b; b=tmp; }

main()

{

int a[10], dim=10;

int i, j, k;

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

{

printf("Элемент\n");

scanf("%d",&a[i]);

}

printf("Было\n");

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

printf("%d\n",a[i]);

/* Проход массива, начиная с 0-го до предпоследнего элемента */

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

{

/* Проход массива, начиная с (i+1)-го до последнего элемента */

for (k = i, j = i+1; j < dim; j++)

if(a[j] < a[k]) k = j; /* Поиск наименьшего k-го эл-та */ swap(a[k], a[i]); /* Перемещение наименьшего "вверх" */

}

printf("Стало\n");

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

printf("%d\n",a[i]);

}

М е т о д Ш е л л а.

Этот метод предложил Donald Lewis Shell в 1959 г. Основная идея алгоритма заключается в том, чтобы вначале устранить массовый беспорядок в массиве, сравнивая далеко стоящие друг от друга элементы. Как видно, интервал между сравниваемыми элементами (gap) постепенно уменьшается до единицы. Это означает, что на поздних стадиях сортировка сводится просто к перестановкам соседних элементов (если, конечно, такие перестановки являются необходимыми).

#include<stdio.h>

#define swap(a,b) { int tmp; tmp=a; a=b; b=tmp; }

main()

{

int a[10], dim=10;

int i, j, gap;

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

{

printf("Элемент\n");

scanf("%d",&a[i]);

}

printf("Было\n");

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

printf("%d\n",a[i]);

for (gap = dim/2; gap > 0; gap/=2) /* Выбор интервала */

for (i = gap;i < dim; i++) /* Проход массива */

/* Сравнение пар, отстоящих на gap друг от друга */

for (j = i-gap; j >= 0 && a[j] > a[j+gap]; j -= gap) swap(a[j], a[j+gap]);

printf("Стало\n");

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

printf("%d\n",a[i]);

}