/**
* 生成随机数
* @param {number} num 生成随机数组长度
* @param {number} max 最大值
* @param {number} min 最小值
*/
function randoms(num, max, min) {
return Array.from({ length: num }).map(() => Math.ceil(Math.random() * (max - min) + min));
}
let num1 = randoms(3, 10, 1);
let num2 = randoms(3, 10, 1);
/**
* shell排序
* @param {number[]} arr
*/
function shellSort(arr) {
console.log(arr);
let temp,
gap = 1,
len = arr.length;
while (gap <= len / 2) {
gap = gap * 3 + 1; // 生成增量
}
// 当分组变成成1时则排序完成
while (gap >= 1) {
// 按增量分组循环数组,每次循环结束按照增量生成方式递减增量
for (var i = gap; i < len; i++) {
temp = arr[i];
console.log('i', i);
// 增量大于零且前面的数组的值大于后面数组的值则交换位置
console.log('是否需要交换位置:', i - gap >= 0 && arr[i - gap] > temp, 'gap:', gap, 'j:', i - gap, 'arr[j]:', arr[i - gap], 'temp:', temp);
for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
console.log('进入arr[j] > temp循环 j,gap:', j, gap, ' arr[j + gap]:', arr[j + gap], ' arr[j]:', arr[j]);
arr[j + gap] = arr[j]; // 交换位置。
}
console.log('------ j + gap:', j + gap, 'i:', i, '\n------ arr[j + gap]', arr[j + gap], 'temp:', temp);
arr[j + gap] = temp; // 如果已经进入 arr[j] > temp 的循环,对应交换位置。
console.log('\n', arr);
console.log('\n');
}
gap = (gap - 1) / 3; // 递减增量
}
return arr;
}
console.time('shell');
console.log(shellSort(num1.concat(num2)));
// console.log(shellSort([6, 1, 4, 3, 1, 2]));
console.timeEnd('shell');
js希尔排序注解
最新推荐文章于 2023-09-23 16:26:22 发布