JavaScript数据结构与算法——基本排序算法

之前以下三种排序算法属于三篇文章,由于都属于基本排序算法,就合并到了一篇,便于对比。

1、冒泡排序

冒泡排序算法简介:

             冒泡排序算法,它是最慢的排序算法之一,但也是一种最容易实现的排序算法。 之所以叫冒泡排序是因为使用这种排序算法排序时,数据值会像气泡一样从数组的一端漂浮到另一端。假设正在将一组数字按照升序排列,较大的值会浮动到数组的右侧,而较小的值则会浮动到数组的左侧。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,当左侧值大于右侧值时将它们进行互换。 

观察规律:以下是数组[72,  54, 58, 30, 31, 78,  2, 77, 82, 72]在进行小到大排序时的各次排序的结果,第一行为数组初始值。

注意观察72和2的是如何移动到右边、左边的,之后会以完整代码举例深入剖析。

解释:在第一次排序中,72与54比较,54移到前面,随后72与58比较,58移到前面......72与78比较时,72小,于是顺序不变,接而78与2对比,2移到前面,接下来78与77比较,77移到前面...于是第一次排序后结果是:54 58 30 31 72 2 77 78 72 82。根据这规律,不难解释接下来的几次排序。

冒泡排序演练:使用冒泡排序算法对数组[10,1,8,6,7,5,3,4,2,9]进行升序排序。

实现代码:

<script>
    function bubbleSort(array) {
        var length = array.length;
        var temp;
        // i可以理解为每次参与排序的项有几个
        // 第一次排序之后,最后一个肯定比前一个大,所以下一次不用再对比最后两个数字
        // 所以i--,减少参与排序的数字的个数,即第二次参与排序的项只有[1,8,6,7,5,3,4,2,9]共9个。
        // 以此类推,最后参与对比的项只有两个,即最后i==2。
        for (var i = length; i >= 2; i--) {
            // 开始循环对比需要对比的项
            for (var j = 0; j <= i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    // 前面的比后面的大,交换位置
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j+1] = temp;
                }
            }
            console.log("第"+(length-i+1)+"次排序结果:"+array.toString()+"--此次参与排序的项为=>"+i); // 用于观察每次排序的结果
        }
        console.log("最终结果:"+array.toString()); // 最终结果
    }
    var array = [10,1,8,6,7,5,3,4,2,9];
    bubbleSort(array);
</script>

 

运行结果如图:


 

总结:

       实现方法几乎每行代码都加以解释,帮助理解;结合每次排序的结果我们可以更加容易地看出小的值是如何移到数组开头的,

大的值又是如何移到数组末尾的,每次参与排序的项有多少个,冒泡排序神秘的面纱就此揭开。

实现降序排序:实现数组降序排序只需要修改内层循环中的条件判断即可,相信各位能轻易实现。

if (array[j] < array[j + 1]) {
    // 后面的比前面的大,交换位置
    temp = array[j];
    array[j] = array[j+1];
    array[j+1] = temp;
}

降序排序运行结果:

 

2、选择排序

升序原理:使用寻找最小值的方法去遍历剩余数组,记录最小值得下标index,然后跟首位交换位置。 
比如对4 3 6 8 2 9 10进行排序 
第一次排序后的结果为: 
2 3 6 8 4 9 10 
第二次: 
2 3 6 8 4 9 10 
因为剩余的数字中3最小,位置不用变化 
第三次: 
2 3 4 8 6 9 10 
第四次 
…….. 
按照以上推算,可得到以下实现代码:

function selectionSort (arr) {
  for (var i = 0; i < arr.length - 1; i++) {
    var min = i
    for (var j = min + 1; j < arr.length; j++) {
      if (arr[j] < arr[min]) {
        min = j;
      }
    }
    if (min !== i) {
      var temp = arr[i];
      arr[i] = arr[min];
      arr[min] = temp;
    }
  }
  return arr
}
var array = [4, 3, 6, 8, 2, 9, 10]
var result = selectionSort(array)
console.log(result.toString())

进入控制台,使用node运行此js文件,可见结果为: 
这里写图片描述

3、插入排序

//    插入排序-原理解释:从数组第二项开始循环,每次循环取当前项与前边的项对比,符合条件则交换位置。  
    function insertSort(array) {  
//        从第二个元素开始循环  
        for (var i = 1; i < array.length; i++) {  
//          从当前项开始往前对比  
            for (var j = i; j > 0; j--) {  
//                前面的比后面的大,交换位置  
                if (array[j-1] > array[j]) {  
                    var temp = array[j];  
                    array[j] = array[j - 1];  
                    array[j - 1] = temp;  
                }  
            }  
        }  
        console.log(array.toString());  
    }  
    insertSort([1,4,5,7,2,9,8]);  

运行结果:

4、快速排序

  function quickSort (arr) {
    let length = arr.length
    if (length <= 1) {
      return arr
    }
    let base = arr[length - 1]
    let left = [], right = []
    for (let i = 0; i < length - 1; i++) {
      if(arr[i] > base) {
        right.push(arr[i])
      } else {
        left.push(arr[i])
      }
    }
    return [...quickSort(left), base, ...quickSort(right)]
  }
  console.log(quickSort([3,23,66,32,2,77,45,87,64,34,33]))

运行结果:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值