-
Notifications
You must be signed in to change notification settings - Fork 640
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
阿里五面:说下希尔排序的过程? 希尔排序的时间复杂度和空间复杂度又是多少? #75
Labels
Comments
希尔排序是插入排序的修改版,是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 时间复杂度为 O(nlogn), 空间复杂度为O(1) // shellSort
function shellSort(arr) {
for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
// 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap
for(let i = gap; i < arr.length; i++) {
let j = i;
let temp = arr[j];
for(; j> 0; j -= gap) {
if(!(j - gap >= 0) || !(temp < arr[j - gap])) {
break;
}
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
return arr;
}
// example
let arr = [2,5,10,7,10,32,90,9,11,1,0,10];
console.log(shellSort(arr)); |
@7777sea 代码有问题,运行结果: |
@elixiao 感谢指出,已经修改了~ |
|
这个写的希尔排序为毛跟我看的不一样?难道不是间隔h? |
@sisterAn 第一趟增量是3,不是应该是[4,8],[1,7],[3,5],第一趟结果[4,1,3,8,7,5] |
感谢 @JerryWen1994 已调整 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
1959年Shell发明,第一个突破 O(n^2^) 的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。
插入排序
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
代码实现:
插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
复杂度分析:
希尔排序
回顾一下上面的插入排序:
2
3
所以,如果序列足够乱的话,时间复杂度为 O(n^2^)
希尔排序又是如何优化的喃?
希尔排序又叫缩小增量排序,就是把数列进行分组(组内不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。
其中组的数量称为 增量 ,显然的是,增量是不断递减的(直到增量为1)
那我们有是如何进行分组喃?
往往的: 如果一个数列有
8
个元素,我们第一趟的增量是4
,第二趟的增量是2
,第三趟的增量是1
。如果一个数列有18
个元素,我们第一趟的增量是9
,第二趟的增量是4
,第三趟的增量是2
,第四趟的增量是1
很明显我们可以用一个序列来表示增量:
n/2、(n/2)/2、...、1
,每次增量都/2
例如:
排序前:
Math.floor(arr.length/2)
),分别是:[4, 8]
,[1, 7]
,[5, 3]
第一趟排序:
[4, 8]
,[1, 7]
,[3, 5]
此时数组是这样子的:
[4, 1, 3, 8, 7, 5]
第二趟排序:
3
,此时增量应该为1
了,因此把[4, 1, 3, 8, 7, 5]
看成一个数组(从宏观上是有序的了),对其进行插入排序,直至有序代码实现:
复杂度分析:
The text was updated successfully, but these errors were encountered: