思想:
两两依次比较,如果顺序错误,就交换,直到没有交换,排序结束。
function bubbleSort(arr) {
let swapped; // 是否有过交换,一旦没有任何元素交换,排序结束
for (let i = 0; i < arr.length; i++) {
swapped = false;
// 注意这里是len - i,每一轮都会把最大的元素放在最后,所以 len - i 后面的元素不用再比较
for (let j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素位置,这里是es6的方式
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
if (!swapped) break;
}
}
思想:
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
arr.forEach((v) => {
v < pivot ? left.push(v) : right.push(v);
})
return quickSort(left).concat([pivot], quickSort(right));
};
注: 计算 pivot 时,不要写成 arr[pivotIndex] ,否则会报如下错
原因:arr[pivotIndex] 取得数组中下标为 pivotIndex 的值,但是并没有从数组中删除该值,再递归调用该元素左边的数组和右边的数组时会出现程序死循环。
arr.splice(pivotIndex,1)[0] 是在原来数组的基础上进行修改,每次都删除了一个元素。