> 文档中心 > 排序算法——希尔排序

排序算法——希尔排序

目录

🛴基本介绍

算法思想

🛹实例

思路分析

 代码实现

 🛵算法性能分析


🛴基本介绍

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为见效增量排序。

希尔排序的时间复杂度比直接插入排序的时间复杂度小,他与直接插入排序的不同在于它会优先比较距离较远的元素。

算法思想

希尔排序是按照一定的增量进行分组排序,对每组使用直接插入排序算法排序;随着分组个数的减少,每组中元素就会越来越多,当增量减少为1时,排序结束。

🛹实例

原始数组:[8,9,1,7,2,3,5,4,6,0]

分组的个数与数据个数有关。一般情况下,选择增量为gap=length/2

分组的个数一般为奇数个,因为偶数组会存在重复排序,所以分组个数为奇数组

思路分析

第一趟排序:初始增量gap=length/2=5,即将整个数组分为五组,对这五组分别进行直接插入排序

 第二趟排序:然后缩小增量,gap=5/2=2,数组被分为两组,对这两组分别进行直接插入排序

第三趟排序

再缩小增量为gap=2/2=1,此时整个数组为1组,进行直接插入排序,结果如下:

 代码实现

public class ShellSort {    public static void main(String[] args) { int []arr={8,9,1,7,2,3,5,4,6,0}; shellSort(arr); System.out.println("排序后的数组为:"+Arrays.toString(arr));    }    private   static  void  shell(int[]arr,int gap){ if (arr==null||arr.length==1){     return; } //从第二个元素开始,和前面的有序表进行比较 for (int i=1;i=0;j-=gap){  if (arr[j]>temp){      arr[j+gap]=arr[j];//后移一个位置  }  else {      break;  }     }     arr[j+gap]=temp; }    }    public  static  void  shellSort(int []arr) { int[] gaps = {5, 3, 1}; for (int i = 0; i < gaps.length; i++) {     shell(arr, gaps[i]); }    }}

运行结果:

 🛵算法性能分析

时间复杂度:O(n^1.3-1.5)

空间复杂度:O(1)

稳定性:不稳定