You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function shellSort(arr) {
let n = arr.length;
for (let gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap / 2)) {
for (let i = gap; i < n; i++) {
let j = i;
let current = arr[i];
while (j - gap >= 0 && current < arr[j - gap]) {
arr[j] = arr[j - gap];
j = j - gap;
}
arr[j] = current;
}
}
return arr;
}
介绍一下快排原理以及时间复杂度,并实现一个快排
快排使用了分治策略的思想,所谓分治,顾名思义,就是分而治之,将一个复杂的问题,分成两个或多个相似的子问题,在把子问题分成更小的子问题,直到更小的子问题可以简单求解,求解子问题,则原问题的解则为子问题解的合并。
快排的过程简单的说只有三步:
首先从序列中选取一个数作为基准数
将比这个数大的数全部放到它的右边,把小于或者等于它的数全部放到它的左边 (一次快排 partition)
然后分别对基准的左右两边重复以上的操作,直到数组完全排序
具体按以下步骤实现:
1,创建两个指针分别指向数组的最左端以及最右端
2,在数组中任意取出一个元素作为基准
3,左指针开始向右移动,遇到比基准大的停止
4,右指针开始向左移动,遇到比基准小的元素停止,交换左右指针所指向的元素
5,重复3,4,直到左指针超过右指针,此时,比基准小的值就都会放在基准的左边,比基准大的值会出现在基准的右边
6,然后分别对基准的左右两边重复以上的操作,直到数组完全排序
快排是从小到大排序,所以第 k 个最大值在 n-k 位置上
复杂度分析
参考: sisterAn/JavaScript-Algorithms#70
洗牌算法
复杂度分析:
参考: sisterAn/JavaScript-Algorithms#70
插入排序
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
复杂度分析:
参考: sisterAn/JavaScript-Algorithms#75
希尔排序
希尔排序又叫缩小增量排序,就是把数列进行分组(组内不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。
其中组的数量称为 增量 ,显然的是,增量是不断递减的(直到增量为1)
复杂度分析:
参考: sisterAn/JavaScript-Algorithms#75
归并排序
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
示例 2:
归并排序采用了分治策略,将数组分成2个较小的数组,然后每个数组再分成两个更小的数组,直至每个数组里只包含一个元素,然后将小数组不断的合并成较大的数组,直至只剩下一个数组,就是排序完成后的数组序列。
第一步:分割
第二步:归并(合并有序链表)
引入递归算法的复杂度分析:
复杂度分析
参考: sisterAn/JavaScript-Algorithms#79
二分查找算法与时间复杂度
二分查找也称折半查找算法,它是一种简单易懂的快速查找算法。例如我随机写0-100之间的一个数字,让你猜我写的是什么?你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。
测试成功
二分查找易错点:
二分查找局限性:
时间复杂度: O(logn)
空间复杂度:O(1)
The text was updated successfully, but these errors were encountered: