资讯专栏INFORMATION COLUMN

JavaScript学习笔记 - 基础排序算法

mindwind / 2139人阅读

摘要:本文记录了我在学习前端上的笔记,方便以后的复习和巩固。冒泡排序算法步骤比较相邻的元素。这步做完后,最后的元素会是最大的数。重复第二步,直到所有元素均排序完毕。得到序列第二趟,,和进行交换。

本文记录了我在学习前端上的笔记,方便以后的复习和巩固。
推荐大家去看看这一本gitBook上的书十大经典排序算法本文就是看这本书记录的笔记。

冒泡排序 1.算法步骤

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2.图片演示:

代码实现:

//数组内两个值互换
function swap(arr, index1, index2) {
    var temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
}
function bubbleSort(arr){
    var len = arr.length,i,j;
    for(i = 0; i < len - 1; i++){    //进行len-1趟选择(循环),第一趟循环会选出最i个最大记录
    //因为i循环已经拿到了最后的数值,i循环一次拿到一次最大的数值所以减i,i = 已被排序好的数值数量
        for(j = 0; j < len - 1 - i;){
        //比较相邻的数值,如果第一个比第二个大就交换他们。 交换到最后最大数值排在数组最后
            if(arr[j] > arr[j+1]){
                swap(arr , j, j+1);
            }
        }
    }
    return arr;
}
详解

依次比较相邻的两个元素,如果后一个小于前一个,则交换,这样从头到尾一次(外循环一次)就将最大的数放在了数组末尾。

从头到尾再来一次(外循环),由于每进行一轮,最后的都已经是最大的了,因此后一轮需要比较(内循环)的次数可以比上一次少一个(i个)。虽然你还是可以让他从头到尾来比较,但是后面比较都是没有意义的,为了效率,你应该对代码进行优化。

选择排序 1.算法步骤

1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3.重复第二步,直到所有元素均排序完毕。

2.动图演示

function selectionSort(arr){
    var len = arr.length;
    var index,temp;
    for(var i = 0; i < arr.length - 1; i++){ //进行len - 1趟选择(循环),选择第i个最小记录。
        var index = i;
        //因为i循环已经拿了最前面的数值 所以j循环复制拿后面的数值和进行对比。
        for(var j = i + 1; j < arr.length; j++){
            if(arr[j] < arr[index]){ //第一次循环次数的min = 1
                index = j;  //将最小数的索引保存,选择第i个小记录的下标赋值给min,arr[min]为最小数值
            }
        }
        if(j != index){   //与第i个小记录交换  i和min相同代表已经排序完毕
            swap(arr, i, index);
        }
    }
    return arr;
}

示例:假设给定数组A[1......6]={ 3,5,8,9,1,2 },我们来分析一下A数组进行选择排序的过程

    第一趟:i=1,index=5, a[1] 和 a[5] 进行交换。得到序列:{ 1,5,8,9,3,2 }
    第二趟:i=2,index=6, a[2] 和 a[6] 进行交换。得到序列:{ 1,2,8,9,3,5 }
    第三趟:i=3,index=5, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,9,8,5 }
    第四趟:i=4,index=6, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,8,9 }
    第五趟:i=5,index=5, 不用交换。得到序列:{ 1,2,3,5,8,9 }
   (6-1)趟选择结束,得到有序序列:{ 1,2,3,5,8,9 }
插入排序 1.步骤

1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

2.动图演示

function insertionSort(arr) {
    var len = arr.length;
    var value;
    //循环len趟,外层循环顺序是从数组的第一位到最后一位
    for(var i = 1; i < len; i++){
        value = arr[i]; //每趟循环拿到第i的数值赋值给Value
        //内层顺序是从后往前 j = i - 1会跳过已经排好序的部分。比较后面的数值是否大于前面的数值
        for(var j = i - 1; j > -1 && arr[j] > value; j--){ 
            arr[j+1] = arr[j]    //满足条件直接交换
        }
         //因为前面已经排好序直接给value赋值排好序的最后一个
        arr[j+1] = value;
    }
}

代码块中的注释只是自己的理解,如果有错误请指正,多谢各位了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82339.html

相关文章

  • javaScript排序算法学习笔记

    摘要:排序算法学习笔记用于创建数组冒泡排序冒泡排序比较任何两个相邻的项,如果第一个比第二个大,则交换它们。归并排序归并排序是一种分治算法。完成下列操作的前提是数组均已经完成。 javaScript排序算法学习笔记 // 用于创建数组 function createNonSortedArray(size) { var array = new ArrayList(); for( ...

    lentoo 评论0 收藏0
  • 优秀程序员都应该学习的 GitHub 上开源的数据结构与算法项目

    摘要:强烈推荐上值得前端学习的数据结构与算法项目,包含图的演示过程与视频讲解。该仓库包含了多种基于的算法与数据结构,提供进一步阅读的解释和链接。数据结构和算法必知必会的个代码实现。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法为王。想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手;只有内功深厚者,前端之路才会走得...

    cheukyin 评论0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同学去面试,做了两道面试题全部做错了,发过来给道典型的面试题前端掘金在界中,开发人员的需求量一直居高不下。 排序算法 -- JavaScript 标准参考教程(alpha) - 前端 - 掘金来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 冒泡排序 简介 算法实现 选择排序 简介 算法实现 ... 图例详解那道 setTimeout 与循环闭包的经典面...

    enali 评论0 收藏0
  • Nicolas讲算法:Computer Science in JavaScript

    摘要:使用来描述算法和数据结构的教程很少,目前市面上用描述算法和数据结构的书屈指可数,并且就我看过的那本而言我只看过数据结构与算法语言描述质量实在堪忧。 使用JavaScript来描述算法和数据结构的教程很少, 目前市面上用JS描述算法和数据结构的书屈指可数,并且就我看过的那本而言(我只看过《数据结构与算法 JavaScript 语言描述》)质量实在堪忧。碰巧有次看到Nicolas博客中的C...

    codergarden 评论0 收藏0

发表评论

0条评论

mindwind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<