算法精讲——排序算法之希尔排序

Posted 万诺coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法精讲——排序算法之希尔排序相关的知识,希望对你有一定的参考价值。

哈喽大家好,我联合整理了一批大厂内推的内容,大家可以在公众号后台回复秋招扫码添加后拉你进秋招内推群,大家也可以在群里交流讨论,部分公司可以直接内推到部门!
前言
如果要把岗位的目标放在中大厂的话,算法这一块是跑不了的,因为八股时至今日已经无法卷出新花样了,如果说中大厂的笔面试就是考核着你的基础、语言、算法、系统设计。
前两者大家总是更乐意去读,因为很快可以看到成果,你能感受到多读一秒你就强上一分。
算法则看到就反胃,但为了那一个棒棒的offer,算法还是要做起来的!
不出意外的话,在这里我们每天会更新一篇以上,大家有什么反馈也可以后台给我说,我都会看的。
希尔排序(Shell Sort) 难度:⭐⭐⭐

1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

4.1 算法描述

插入排序的平均时间复杂度是O(n^2)。这个排序算法并不复杂,但显然并不是一个高效的排序算法。
插入排序具有以下特点:
在大多数元素已经有序的情况下,插入排序的工作量较小。如果一个数组大部分元素都有序,那么数组中的元素自然不需要频繁地进行比较和交换。
希尔排序的核心思想就是:对原数组进行预处理,使得原数组的大部分元素变得有序。
因此希尔排序采用的是一种分组排序的方法,以此对数组进行一定的粗略调整


所谓分组,就是让元素两两一组,同组两个元素之间的跨度,都是数组总长度的一半,也就是跨度为4。
算法精讲——排序算法之希尔排序
如图所示,元素5和元素9一组,元素8和元素2一组,元素6和元素1一组,元素3和元素7一组,一共4组。
接下来,我们让每组元素进行独立排序,排序方式用直接插入排序即可。由于每一组的元素数量很少,只有两个,所以插入排序的工作量很少。每组排序完成后的数组如下:
算法精讲——排序算法之希尔排序
这样一来,仅仅经过几次简单的交换,数组整体的有序程度得到了显著提高,使得后续再进行直接插入排序的工作量大大减少。这种做法,可以理解为对原始数组的“粗略调整”。
但是这样还不算完,我们可以进一步缩小分组跨度,重复上述工作。把跨度缩小为原先的一半,也就是跨度为2,重新对元素进行分组:
算法精讲——排序算法之希尔排序
如图所示,元素5,1,9,6一组,元素2,3,8,7一组,一共两组。
接下来,我们继续让每组元素进行独立排序,排序方式用直接插入排序即可。每组排序完成后的数组如下:
 
此时,数组的有序程度进一步提高,为后续将要进行的排序铺平了道路。
最后,我们把分组跨度进一步减小,让跨度为1,也就等同于做直接插入排序。经过之前的一系列粗略调整,直接插入排序的工作量减少了很多,排序结果如下:

 

4.2 代码实现

  
    
    
  
public static void ShellSort(int[] arr) {
//分组
for (int gap = arr.length / 2; gap >= 1 ; gap=gap/2) {
//插入排序
for (int j = gap; j < arr.length; j++) {
int cur = arr[j] ;
for (int k = j - gap; k >= 0; k-=gap) {
if (cur < arr[k]) {
arr[k + gap] = arr[k] ;
arr[k] = cur ;
}
else
break;
}
}
}
}

以上是关于算法精讲——排序算法之希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之希尔排序

排序算法之希尔排序

图解排序算法之希尔排序

图解排序算法之希尔排序

图解排序算法之希尔排序

重温基础算法内部排序之希尔排序法