package com.heu.wsq.basic.sort_algorithm;
/**
* 希尔排序
* @author wsq
* @date 2021/4/16
* 希尔排序(Shell sort)是基于插入排序的快速排序算法,第一个打破O(n2)的排序算法
* 对于大规模乱序数组插入排序很慢,因为它总是需要交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。
* 希尔排序会优先比较距离较远的元素。交换不相邻的元素以对数组的局部进行排,最终使用插入排序将局部有序的数组排序。
*/
public class ShellSort {
public void sort(int[] nums){
int n = nums.length;
// 定义希尔排序的初始间隔为1,如果h为1时候,退化为插入排序
int h = 1;
/**
* 动态调整h的大小,一般h直接取为n/2也可以
*/
while(h < n/3){
h = h * 3 + 1;
}
while(h >= 1){
for(int i = h; i < n; i++){
for(int j = i; j >= h && less(nums[j], nums[j - h]); j -= h){
swap(nums, j, j - h);
}
}
h /= 3;
}
}
private boolean less(int num1, int num2){
return num1 < num2;
}
private void swap(int[] nums, int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
public static void main(String[] args) {
int[] arr = {5, 2, 1, 7, 9, 3, 8 ,2};
ShellSort shellSort = new ShellSort();
shellSort.sort(arr);
for(int i = 0; i < arr.length; i++){
System.out.print(i + ",");
}
}
}
希尔排序
本文介绍了希尔排序,一种基于插入排序的快速排序算法。希尔排序通过设置初始间隔并逐步缩小间隔,对数组的局部进行预排序,最后使用插入排序完成整个数组的排序。文章包含希尔排序的Java实现代码,并通过示例展示了其排序过程。
18万+

被折叠的 条评论
为什么被折叠?



