排序 js

if (Array.isArray(arr) && arr.length === 0) { console.log('数组为空'); }

一、冒泡(这里的两个for循环,第一个代表轮数,第二个代表比较的次数)

// let arr = [1,2,3,4,5,6,7];
let arr = [6,9,3,1,7,4,2];

function bubbleSort(arr) {
    const len = arr.length;
    for (let i = 0; i < len; i++) {
        console.log('I----------------------------------------',arr[i],arr);
        for (let j = 0; j < len - 1; j++) {
            console.log('J',arr[j]);
            if (arr[j] > arr[j + 1]) {
                // 相邻元素两两对比
                let temp = arr[j]; // 元素交换
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                }
            }
        }
    return arr;
}

bubbleSort(arr);

当arr换成第一个arr的时候,运行代码,也是做了很多无用功的

即使在每轮的第二个for循环结束后第一大数、第二大数,第三大数都会排在最后一位,增加了无效比较的次数

只需要轻微的改变就可以,如下;将每轮的第二个for循环长度每次减去轮次数

let arr = [1, 2, 3, 4, 5, 6, 7];
// let arr = [6,9,3,1,7,4,2];

//函数bubbleSort,用于冒泡排序
function bubbleSort(arr) {
  const len = arr.length;
  //外层循环,控制比较的轮数
  for (let i = 0; i < len; i++) {
    console.log("I----------------------------------------", arr[i], arr);
    //内层循环,控制每轮比较的次数
    for (let j = 0; j < len - 1 - i; j++) {
      console.log("J", arr[j]);
      //每轮比较,如果前一个元素大于后一个元素,则交换
      if (arr[j] > arr[j + 1]) {
        // 相邻元素两两对比
        let temp = arr[j]; // 元素交换
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  //返回排序后的数组
  return arr;
}

//调用函数bubbleSort,对数组arr进行冒泡排序
bubbleSort(arr);

二、快排

快速排序快速排序的实现,一看就能明白icon-default.png?t=N7T8https://www.yangfei.wiki/zh/post/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

function quickSort(arr) {
  if (arr.length <= 1) return arr
  const mIdx = Math.floor(arr.length / 2);
  const middle = arr[mIdx];
  const left = [];
  const right = []
  arr.forEach((item, idx) => {
    // 索引值不能相等
    if (idx !== mIdx) {
      if (item >= middle) {
        right.push(item)
      }
      if (item < middle) {
        left.push(item)
      }
    }
  })
  return quickSort(left).concat([middle], quickSort(right))
}

const a = [1, 22, 22, 13, 14, 14, 16, 19, 17, 18]

const b = quickSort(a)

console.log(b)

let arr = [6,9,3,5,7,4,2];
//函数quickSort,用于快速排序
function quickSort(arr) {
    //如果数组长度小于等于1,则直接返回
    console.log("-------------------本次循环开始了哈,当前将要处理的arr是", arr);
    if (arr.length <= 1) {
        console.log('当前arr无需进一步处理,直接返回')
        // 如果数组长度小于等于1无需判断直接返回
        return arr;
    }
    let pivotIndex = Math.floor(arr.length / 2);  //取基准点
    console.log(pivotIndex, "是当前arr的长度的中间值下标index值" );
    let pivot = arr.splice(pivotIndex, 1)[0];  //
    console.log('arr.splice(pivotIndex, 1)', arr.splice(pivotIndex, 1))
    console.log("pivot", pivot);
    let left = [];
    let right = [];
    //遍历数组,将基准点左右两边的元素分别存入left和right数组
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    console.log('left',left,'right',right)
    console.log('=====================本次循环结束了哈,arr被改造成了', arr);
    //递归调用quickSort函数,对left和right数组分别进行快速排序,最后将基准点插入到排序后的数组中
    return quickSort(left).concat([pivot], quickSort(right));
}
console.log(quickSort(arr))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值