Объясните каждую строчку в методе shellSort

145
16 мая 2019, 17:10

Рассматриваю пример изучения на практике алгоритмов сортировок. Не могу разобраться с циклами. Пожалуйста, объясните каждую строчку в методе shellSort. Сортировка Шелла - модифицированная сортировка вставками. Разбивается на три этапа с определенными шагами, которые можно определить разными способами.Например в данном случае d=3(arr[0],arr[3],arr[6]) d=2 d=1. C каждым шагом делается сортировка вставками, сортируя и поэтапно приближая массив к отсортированному.

class SortShell
{
    public static void SubMain(string[] args)
    {
        int[] arr = new int[] { 5, -4, 11, 0, 18, 22, 67, 51, 6 };
        int n;
        n = arr.Length;
        Console.WriteLine("Original Array Elements :");
        show_array_elements(arr);
        shellSort(arr, n);
        Console.WriteLine("\nSorted Array Elements :");
        show_array_elements(arr);
    }
    static void shellSort(int[] arr, int array_size)
    {
        int i, j, inc, temp;
        inc = 3;                  
        while (inc > 0)
        {
            for (i = 0; i < array_size; i++)
            {
                j = i;
                temp = arr[i];
                while ((j >= inc) && (arr[j - inc] > temp)
                {
                    arr[j] = arr[j - inc];
                    j = j - inc;
                }
                arr[j] = temp;
            }
            if (inc / 2 != 0)
                inc = inc / 2;
            else if (inc == 1)
                inc = 0;
            else
                inc = 1;
        }
    }
    static void show_array_elements(int[] arr)
    {
        foreach (var element in arr)
        {
            Console.Write(element + " ");
        }
        Console.Write("\n");
    }
}
Answer 1
 static void shellSort(int[] arr, int array_size)
    {
        int i, j, inc, temp;// объявление переменных
        inc = 3;//присвоение значения для переменной                  
        while (inc > 0)//цикл с предусловием. будет работать пока условие истинно
        {
            for (i = 0; i < array_size; i++)//задается начальное значение индекса,границы этого значения, и шаг изменения индекса после каждого прохода цикла
            {
                j = i; // присвоение
                temp = arr[i]; // в переменную записываем определенное значение массива индекс которого i.  Если  і = 5   то соответственно это пятый элемент массива
                while ((j >= inc) && (arr[j - inc] > temp)// для этого цикла уже два условия и он буде работать пока их совместный результат будет правдив
                {
                    arr[j] = arr[j - inc]; 
                    j = j - inc;
                }
                arr[j] = temp;
            }
            if (inc / 2 != 0)//условие, код условия выполнится когда условие правдиво
                inc = inc / 2;
            else if (inc == 1) //если первое условие не правдиво то проверяется это
                inc = 0;
            else // если никакое из условий выше не сработало то будет выполнен код этого условия
                inc = 1;
        }
    }
READ ALSO
WPF как правильно создавать MenuItem?

WPF как правильно создавать MenuItem?

Я пытаюсь худо-бедно реализоввывать паттерн MVVMПри создании MenuItem возникли впросы по поводу привязки данных

208
Показать координаты точки графика при наведении

Показать координаты точки графика при наведении

есть график функции типа chartНеобходимо написать код, что бы по наведению мышки на точку графика, показывались координаты точки

162
C# SendMessage отправку двух языков

C# SendMessage отправку двух языков

Нужно чтобы программа брала из textbox текст и отправляла, по нажатию кнопки, в то место, где грубо говоря ее вставят, будь то строчка в браузере...

197
Вращение PolygonCollider2D

Вращение PolygonCollider2D

Столкнулся с проблемойСуть: создаю двумя кликами объект из префаба

151