0Основные заметки по C# 09. Метод сортировки по холмам


предисловие

Можно сказать, что сортировка Хилла является вариантом сортировки вставками. Будь то сортировка вставкой или пузырьковая сортировка, если максимальное значение массива находится в первой позиции, для перемещения его в правильную позицию требуется n - 1 ход. Другими словами, если элемент исходного массива находится далеко от своего правильного положения, его необходимо много раз поменять местами с соседними элементами, чтобы достичь правильного положения, что занимает относительно много времени. Сортировка по холму — это простое улучшение сортировки вставками с целью ускорить процесс, заменяя несмежные элементы для сортировки частей массива.

1. Идея сортировки Хилла

Используя метод сортировки вставками, сначала отсортируйте элементы массива на любом интервале h. Вначале размер h может быть h = n/2, затем пусть h = n/4 и пусть h продолжает уменьшаться. Когда h = 1, то есть в этот момент упорядочивается любой элемент массива с интервалом 1, и массив в этот момент упорядочивается.
Я также подготовил картинки для облегчения понимания:
Вставьте сюда описание изображения
Если вы все еще не поняли, я также подготовил для вас качественную статью, которая объяснит: Сортировка холмов

2. Этапы использования

public class ShellSort {
    
    
    public static int[] shellSort(int arr[]) {
    
    
        if (arr == null || arr.length < 2) return arr;
        int n = arr.length;
        // 对每组间隔为 h的分组进行排序,刚开始 h = n / 2;
         for (int h = n / 2; h > 0; h /= 2) {
    
    
            //对各个局部分组进行插入排序
             for (int i = h; i < n; i++) {
    
    
                // 将arr[i] 插入到所在分组的正确位置上
                insertI(arr, h, i);
            }
     }
     return arr;
    }

    /**
     * 将arr[i]插入到所在分组的正确位置上
     * arr[i]] 所在的分组为 ... arr[i-2*h],arr[i-h], arr[i+h] ...
     */
    private static void insertI(int[] arr, int h, int i) {
    
    
        int temp = arr[i];
        int k;
        for (k = i - h; k > 0 && temp < arr[k]; k -= h) {
    
    
            arr[k + h] = arr[k];
        }
        arr[k + h] = temp;
    }
}

Подведем итог

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

Свойства:
1. Временная сложность: O(nlogn)
2. Пространственная сложность: O(1)
3. Нестабильная сортировка
4. Сортировка на месте.

Guess you like

Origin blog.csdn.net/BeanGo/article/details/132210436