Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика (лекции).doc
Скачиваний:
54
Добавлен:
19.03.2016
Размер:
2.31 Mб
Скачать

Лекция 9 Алгоритмы сортировки одномерных массивов

Цели:

  • познакомиться с некоторыми алгоритмами сортировки массивов и разработки соответствующего проекта в среде Visual C++ 6.0.

1. Сортировка одномерных массивов

Под сортировкой понимается упорядочение элементов некоторой последовательности в нужном порядке (убывания или возрастания). Существует достаточно много алгоритмов сортировок послед-овательностей. Но мы остановимся только на трёх, наиболее простых.

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

Идея метода отражена в его названии. Шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то они меняются местами. При этом самые «легкие» (наименьшие) элементы массива «всплывают» наверх, а самые «тяжелые» – «тонут». Алгоритмически это можно реализовать следующим образом. Весь массив просматривается снизу вверх, стоящие рядом элементы меняются в том случае, если «нижний» элемент меньше, чем «верхний». Таким образом, наверх «всплывет» самый «легкий» элемент всего массива. Так нужно повторять для оставшихся неотсортированными N-1 элементов (т.е. для тех, которые лежат «ниже» первого) и т.д. Алгоритм достаточно прост:

Алгоритм (в порядке возрастания)

Программа

объявление вещ: t[10],x, цел:i,j,k,flag

для i=0 до 10-1 шаг 1

ввод t[i]

все_для i

для i=10-1 до 1 шаг -1

//обмена не было

flag=0

для j=0 доi-1 шаг 1

если t[j]>t[j+1]

//меняем местами два соседних

//элемента

x=t[j]

t[j]=t[j+1]

t[j+1]=x

//обмен состоялся

flag=1

все_если

все_для j

если flag==0

выход из цикла по i// не было

// обмена

все_если

все_для i

для i=0 до 10-1 шаг 1

вывод t[i]

все_для i

#include "stdio.h"

#include "math.h"

#define N 10

int main ( )

{

float t[N], x;

int i, j, k, flag;

// ввод массива t с клавиатуры

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

{

printf ("x[%i]= " ,i );

scanf ("%f", &t[i]);

}

for ( i=N-1; i>=1; i-- )

{

//обмена не было

flag=0;

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

{

if(t[j]>t[j+1])

{

// элементы меняются

// местами

x=t[j];

t[j]=t[j+1];

t[j+1]=x;

//обмен состоялся

flag=1;

}

}

if(flag= =0)

//если обмена не было, то нужно

//выйти из цикла

break;

}

// вывод массива tна экран

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

printf ("%.3f ", t[i]);

printf ("\n");

return 1;

}