题解 | #快速排序#
快速排序
https://www.nowcoder.com/practice/38da660199d0400580ac3905c05f5bd6
希尔排序
const quickSort= (arr) => {
// 设置步长(间隔) 4
for (
var gap = Math.floor(arr.length / 2);
gap > 0;
gap = Math.floor(gap / 2)
) {
console.log(gap, "一、步长");
for (var i = gap; i < arr.length; i++) {
console.log(i, "二、找到的元素");
for (var j = i - gap; j >= 0 && arr[j] > arr[gap + j]; j -= gap) {
console.log("三、当前元素a" + arr[j], "当前元素b", arr[gap + j]);
var ret = arr[j];
arr[j] = arr[gap + j];
arr[gap + j] = ret;
}
}
}
return arr;
};
数组中间值比较排序
const _quickSort = (array) => {
if (array.length === 0 || array.length === 1) return array;
let baseIndex = Math.floor(array.length / 2);
let base = array.splice(baseIndex, 1);
let left = [];
let right = [];
for (let i = 0; i < array.length; i++) {
if (array[i] <= base) {
left.push(array[i]);
} else {
right.push(array[i]);
}
}
return _quickSort(left).concat(base, _quickSort(right));
};
两者的区别就是:
数组中间值比较排序是根据数组的中间值去比较,然后分门别类,最后按左右数学的X轴规则合并,
而希尔排序是是设置一个动态步长根据每轮的条件去定义步长,然后比较当前值和下一个值,是否要交换位置。