数据结构

冒泡排序

思想:

        两两依次比较,如果顺序错误,就交换,直到没有交换,排序结束。

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] 是在原来数组的基础上进行修改,每次都删除了一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值