Каталог статей
предисловие
Можно сказать, что сортировка Хилла является вариантом сортировки вставками. Будь то сортировка вставкой или пузырьковая сортировка, если максимальное значение массива находится в первой позиции, для перемещения его в правильную позицию требуется 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. Сортировка на месте.