Сортировка по холму хорошо работает для сортировки массивов среднего размера, содержащих до нескольких тысяч элементов данных. Сортировка по холму не такая быстрая, как быстрая сортировка и другие алгоритмы сортировки с временной сложностью O (n * log). не является оптимальным выбором для сортировки очень больших файлов, но сортировка по Хиллу выполняется намного быстрее, чем сортировка выбором и сортировка вставками, временная сложность которых равна O(n²), ее очень легко реализовать, а код короткий.
Сортировка Хилла также является разновидностью сортировки вставками. При сортировке вставками, если наименьшее число находится в конце, Хилл решает эту проблему. Это также n-инкрементальная сортировка. Ее идея заключается в увеличении интервала между числами. элементов при сортировке вставками и выполнении сортировки вставками между этими элементами данных, когда эти элементы данных сортируются один раз, алгоритм сортировки Хилла уменьшает расстояние между элементами данных, а затем сортирует их и так далее. Расстояние между элементами данных при выполнении этих сортировок называется приращением и обычно обозначается буквой h.
Для массива, который будет отсортирован по Хиллу, начальный интервал должен быть больше, а затем интервал должен непрерывно уменьшаться, пока интервал не станет равным 1.
Последовательность разделителей:
Качество чисел в разнесенных последовательностях часто считается важным — у них нет общих делителей, кроме 1. Это ограничение повышает вероятность того, что каждый проход сортировки сохранит эффект предыдущего прохода. Для разных разнесенных последовательностей существует абсолют. условием является то, что постепенно уменьшающийся интервал должен в конечном итоге равняться 1. Следовательно, последний проход представляет собой обычную сортировку вставками.
Приведенные ниже примеры основаны на правиле h=h*3+1:
пакет com.jll.sort; общественный класс ShellSort { int [] arr; int size; public ShellSort () { super (); } public ShellSort (int size) { this.size = size; arr = new int [size]; } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" " ); } ss.shellSort(); System.out.println(); System.out.println("после сортировки:"); for(int i=0;i<10;i++){ System.out.print(ss.arr[i]+" "); } } public voidshellSort(){ int h = 1; while(h<=size/3){h = h*3+1 }; (;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; int j = i; while(j>h-1&&arr[jh]>temp){ arr[j]=arr[jh] } arr[j]=temp;