js带注释的冒泡排序算法

一、简述
冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果二者的顺序(如从大到小、首字母从A到Z)错误就交换。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

第一种:常规方法冒泡排序

比较相邻的两个元素,如果前一个比后一个大,则交换位置。
第一轮把最大的元素放到了最后面。
由于每次排序最后一个都是最大的,所以之后按照步骤1排序最后一个元素不用比,最理想的情况是已经按顺序排好的队列,只需要扫描一次就结束并且不需要做任何位置交换,复杂度为O(n); 最差为O(n2)

function bubbleSort(data){

  if(data.length<1) return data;

  let n = data.length;

  for(let i=0;i<n;i++){

    //因为扫描完一次后,最后一个不用比了,所以要n-i进行边界处理,达到优化性能目的

    for(let j=0;j<n-i; j++){
      if(data[j]>data[j+1]){

        // 交换函数
        let swap = data[j];

        data[j] = data[j+1];

        data[j+1] = swap;

      }

    }
  }

  return data;

}

 

第二种: 对冒泡排序的改进

声明一个变量标记顺序是否发生变化

function bubbleSort(data){
  let n = data.length;

  let flag = true

  let swap

  // 只要存在位置更换就进入循环

  while(flag){

    flag = false

    // 每次排序最后一个都是最大的, 所有循环结束后,就得到了升序队列。

    for(let i=0;i<n;i++){
     if(data[i]>data[i+1]){

       // 交换函数

       swap = data[i]

       data[i]  = data[i+1]
       data[i+1] = swap;

       flag = true;

     }

    }

    // /因为扫描完一次后,最后一个不用比了,所以要n--进行边界处理,达到优化性能目的

    n--;

  }

  return data;
}

第三种: 也是对冒泡排序的一种改进, 即快速排序: 快速排序使用分治策略,通过选择一个基准值,将数组分成两部分,一部分小于基准值,另一部分大于基准值,然后递归地对这两部分进行排序。

第一遍排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行排序。

function bubbleSort(data) {

  // 队列只有一个数或者没有数,返回原队列
  if(data.length <= 1) {
    return data
  }
  // 在队列中向取整,找到一个理论上的中间值索引
  let pIndex = Math.floor(data.length/2)

  // 从原队列中删除该中间值,并且取出该值。
  let p = data.splice(pIndex, 1)[0]

  // 小于中间值的左边部分
  let left = []

  // 大于中间值的右边部分
  let right = []

  // 通过扫描已经删除了中间值的队列,分别得到小于中间值的左边部分和大于中间值的左边部分
  for(var i = 0; i<data.length; i++) {
    if(data[i] < p) {
      left.push(data[i])
    } else {
      right.push(data[i])
    }
  }
  // 分别递归左边,右边
  let nLeft = bubbleSort(left);
  let nRight =  bubbleSort(right)

  // 返回新的队列
  return nLeft.concat([p], nRight);
}

 

posted @ 2024-04-17 11:12  播种者  阅读(3)  评论(0编辑  收藏  举报