JavaScript进修笔记 - 基本排序算法

本文纪录了我在进修前端上的笔记,轻易今后的温习和稳固。
引荐人人去看看这一本gitBook上的书十大典范排序算法本文就是看这本书纪录的笔记。

冒泡排序

1.算法步骤

1.比较相邻的元素。假如第一个比第二个大,就交流他们两个。
2.对每一对相邻元素作一样的事情,从最先第一对到末端的末了一对。这步做完后,末了的元素会是最大的数。
3.针对一切的元素反复以上的步骤,除了末了一个。
4.延续每次对越来越少的元素反复上面的步骤,直到没有任何一对数字须要比较。

2.图片演示:

《JavaScript进修笔记 - 基本排序算法》

代码完成:

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

《JavaScript进修笔记 - 基本排序算法》

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

《JavaScript进修笔记 - 基本排序算法》

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

代码块中的解释只是本身的明白,假如有毛病请斧正,多谢列位了

    原文作者:Jasonzj
    原文地址: https://segmentfault.com/a/1190000008929031
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞