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

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

冒泡排序

1.算法步骤

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

2.图片演示:

clipboard.png

代码实现:

//数组内两个值互换
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.动图演示

clipboard.png

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.动图演示

clipboard.png

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;
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值