Добрый день друзья. Продолжаем изучать одномерные массивы. Сегодня у нас важная тема. Изучим основные алгоритмы работы с массивами: поиск в массиве и его сортировка.
Почему я говорю, что этот урок важный? Просто обработка массивов, наряду с работой со строками,  это одна из самых типичных задач в программировании.  Ни для кого не секрет, компьютеры появились для решения вычислительных задач математики.  А вычислительные задачи, обычно связаны с большим объемом однотипных данных, которые где хранятся? Ага, правильно. Массивы.
Итак, не будем тянуть быка за хвост, ухватимся сразу за рога. Начнем с самого простого.

Поиск минимального элемента в массиве.

Поставим задачку. Пускай имеется массив из целых чисел. Необходимо среди всех элементов массива, найти элемент с минимальным значением. 
Это задачка даже не на одну трубку.  Сначала взгляните на картинку, и найдите в этом столбике минимальный элемент.

Рис.1 Одномерный массив
А теперь стоп.  Задумайтесь на секундочку, как вы это сделали? Скорее всего, вы пробежались по столбику глазами, и выявили там самое меньшее число.  Аналогичную процедуру должна выполнить и наша программа.
Первым делом следует подумать, где будет храниться минимальное значение. Для него необходима отдельная переменная. Назовем её min. Сохраним в неё значение первого элемента массива, чтобы нам было с чем сравнивать. Дальше нужно пройтись по массиву. Это не сложно, организуем для этого цикл. В работе с массивами в большинстве случаев используется цикл for. Так как там сразу же есть счетчик, который меняется  каждой итерации. Теперь основная часть алгоритма. Нам нужно последовательно сравнивать элементы массива с минимальным, и если окажется так, что элемент массива меньше минимального, то следует сохранить это значение вместо него.  Вот, в принципе, и весь алгоритм.
Теперь запишем это все в виде программы.
Листинг  12.1
#include <stdio.h> 
int main(){
      int min, arr[11]={5,14,7,4,11,2,6,12,8,7,3};
      min = arr[0];
      for (int i=1; i<11; i++){
            if (arr[i]<min)
                  min = arr[i];
      }
      printf(«%dn», min);
      return(0); 
}
Обратите внимание, что в данном случае мы задали элементы массива при его объявлении. Запомните этот способ, он тоже иногда бывает полезен.  Кстати, если бы мы объявили не все элементы, а лишь часть из них, то все остальные, автоматически заполнились бы нулями. Можете это проверить самостоятельно.
В дополнение к словесному описанию проиллюстрируем картинкой работу нашей программы.
Рис. 2 Иллюстрация поиска минимума в одномерном массиве.
Еще раз посмотрите приведенный выше код, вам должно быть в нем все понятно. Аналогично можно найти максимальный элемент в массиве.

Сортировка массива.

Теперь пускай нам необходимо отсортировать массив, например, по возрастанию. То есть в начале стоит самый маленький элемент, а в конце самый большой. Будем рассматривать самый простой алгоритм сортировки – сортировка обменом. Другое название этой сортировки — сортировка «пузырьком».
Рассмотрим, как говорит мой преподаватель по курсу «методы оптимизации», философию метода.
Для определенности будем считать, что имеем дело с целочисленным массивом.  Начиная с первого элемента, поочередно сравниваем  соседние элементы, т.е. первый и второй, второй и третий, третий и четвертый и так до конца массива. Если упорядоченность массива нарушена, то меняем эти элементы местами. Так как мы упорядочиваем массив по возрастанию, в нашем случае первый элемент должен быть меньше следующего.
Давайте рассмотрим иллюстрирующую этот шаг алгоритма картинку.
Рис. 3. Пример первого шага сортировки одномерного массива методом обмена.
Как видите,  самый тяжелый элемент – тонет, то есть опускается на самый низ. А более легкие элементы, как бы всплывают, как пузырьки в воде. Отсюда, в принципе, и название алгоритма. Как видите, после одного прохода алгоритма, на последнее место. Получается, после одного шага алгоритма один элемент уже точно занимает свое место, и при следующем проходе, нам уже нет необходимости сравнивать предпоследний и последний элемент, так как последний элемент уже на своем месте и ничего менять не придется, так зачем лишнее действие? Правильно, незачем. А мы и не будем.  
Повторяя описанную процедуру n-1 раз (здесь n – размерность массива) получим полностью отсортированный массив.
На следующем рисунке проиллюстрирована работа алгоритма, на примере небольшого массива.
Рис. 4. Иллюстрация сортировки массива методом «пузырька».
Приведем код реализации алгоритма сортировки пузырьком, на языке Си. Обратите внимание на поясняющие комментарии.
Листинг 12.2
#include <stdio.h> 
int main(){
      int n=6, // размерность массива 
            arr[6]={5,14,7,4,11,2}; // массив для сортировки 
      for (int i=n-1;i>0;i—)
            for (intj=0;j<i;j++)
                  if(arr[j]>arr[j+1]){ // если порядок нарушен 
                       //меняем j и j+1 элементы массива местами 
                        int temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=tmp;
                  }
      //выводим массив на экран 
                  for (int i=0;i<n; i++)
                        printf(«%dn», arr[i]);
      return(0); 
}
Помните, мы говорили, что на каждом шаге нам нужно сокращать длину основного цикла? Т.е. сначала проходим все элементы до n-1, на следующем шаге до n-2 и т.д.  В приведенном выше алгоритме это реализовано внешним циклом. Обратите внимание, что мы впервые используем направление цикла «сверху вниз». Т.е. движемся не от единицы к n, а наоборот, от n-1 к 1.
На этом сегодняшнее занятие окончено.
Задание для практической работы.
  • Задан целочисленный массив a. Написать программу, которая ищет максимальный элемент в массиве и выводит на экран его номер. Обратите внимание не значение, а номер элемента в массиве.
  • Задан целочисленный массив  arr[1000], в котором существует минимум 10 различных значений. Найти 10 по величине элемент массива.
  • Задан целочисленный массив arr[40] . Найти количество элементов массива,  которые по модулю меньше произвольного наперед заданного числа.  Вывести количество таких элементов в массиве. 
  • Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент.
  • В уроке был приведен кусок кода, в котором с помощью дополнительной переменной меняются местами два элемента массива.  Подумайте, как можно обменять значения двух переменных, не используя дополнительной переменной.  Т.е. например, int a=3, b=5; должно стать a=5, b=3; Помните, что использовать дополнительные переменные нельзя.
При выполнении заданий, помните о нашей договоренности, код программы оформлять в виде отдельных функций.

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

От KaDeaT