Сортировка вставками — это алгоритм, в котором элементы массива просматриваются по одному, и каждый элемент элемент размещается в подходящее место среди ранее упорядоченных элементов. С этим алгоритмом сортировки многие из нас сталкиваются в жизни, не подозревая, что используют сортировку вставками — когда сортируют деньги в кошельке. Например, вы получаете в магазине сдачу — 550 рублей. Открываете кошелек — там лежит 200, 1000 и 5000 рублей. Те, кто любит порядок делают так: берут 50 рублей и вставляют их в подходящее место (в самое начало), затем берут 500 рублей и вставляют между 200 и 1000 рублями и в итоге получают упорядоченный «массив» денег 50, 200, 500, 1000 и 5000 рублей. Вот наглядный пример сортировки вставками. Этот алгоритм чем-то напоминает гномью сортировку, но требует вложенного массива.
Алгоритм
Внешний цикл начинает работу со второго элемента массива. Запоминаем значение второго элемента массива. Во внутреннем цикле сравниваем каждый предыдущий элемент массива с текущим и, при необходимости, меняем их местами до тех пор, пока не дойдем до начала цикла или пока не встретится элемент менее текущего. В результате массив отсортируется по возрастанию.
Реализация алгоритма вставками в C#
Для реализации алгоритма нам потребуется метод Swap()
меняющий два элемента массива местами и, собственно, метод, реализующий метод сортировки массива вставками.
static void Swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } static void InsertionSort(int[] inArray) { int x; int j; for (int i = 1; i < inArray.Length; i++) { x = inArray[i]; j = i; while (j > 0 && inArray[j - 1] > x) { Swap(inArray, j, j - 1); j -= 1; } inArray[j] = x; } }
Пример сортировки массива
Console.WriteLine("Введите через запятую целые числа и нажмите Enter"); string[] nums = Console.ReadLine().Split(new char[] { ',' }); int[] intArray = new int[nums.Length]; for (int i = 0; i < nums.Length; i++) { intArray[i] = int.Parse(nums[i]); } InsertionSort(intArray); Console.WriteLine("\r\nОтсортированный массив:"); foreach (int value in intArray) { Console.Write($"{value} "); }
Консольный вывод:
90,-90,1,2,3,4,5,9,8,7,6,5,4,3,2,1
Отсортированный массив:
-90 1 1 2 2 3 3 4 4 5 5 6 7 8 9 90