今日事项-2024年7月20日

今日事项-2024年7月20日

事项一 吃透一个算法

希尔排序:

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

希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版)》的合著者Robert Sedgewick提出的。 

算法描述:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列个数k,对序列进行k 趟排序;

每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

动画演示:
希尔排序

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function shellSort(arr) {
var len = arr.length;
for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap /2)) {
for (var i = gap; i < len; i++) {
for (var j = i - gap; j >= 0 && arr[j] > arr[gap + j]; j -= gap) {
var temp = arr[j];
arr[j] = arr[gap + j];
arr[gap + j] = temp;
}
}
}
}
var arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
console.log(arr); // [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
shellSort(arr);
console.log(arr); // [4, 13, 27, 38, 49, 49, 55, 65, 76, 97]

今日事项-2024年7月20日
http://example.com/2024/07/20/今日事项-2024年7月20日/
Beitragsautor
XiangHui
Veröffentlicht am
July 20, 2024
Urheberrechtshinweis