大家好我是逆战班的一名学员,今天要跟大家分享的是js的排序算法。排序算法有冒泡排序和选择排序两种排序方式。

首先,我们来了解一下这两种排序的核心,冒泡排序的核心是相邻的两个单元来比较数值的大小,如果触发了条件,就交换存储数值。而选择排序的核心是从起始位置开始,与之后的单元比较,如果触发条件,存储这个单元的索引下标,循环结束;如果索引下标不是起始位置下标,交换存储数值。

我们可以通过一个例子来了解一下冒泡排序与选择排序的区别以及它们使用的情境。

冒泡排序:

var arr = [5,4,3,2,1];
        for (var j = 0; j <= (arr.length - 1) - 1; j++) {
                for (var i = 0; i <= (arr.length - 1) - 1 - j; i++) {

交换存储的数据

var middle = 0;
                        middle = arr[i];
                        arr[i] = arr[i + 1];
                        arr[i + 1] = middle;
                    }
                }
            }
执行结果是:array(5)—>[1,2,3,4,5,]

(原理:从前往后,比较相邻的两个数,如果前边的数大于后边的数,就相互交换。)

选择排序:

var arr = [3,5,7,2,5,1,9];
        for(var j = 0 ; j <= arr.length-1 -1 ; j++){
            var min = j;
            for(var i = j+1 ; i <= arr.length-1 ; i++){
                if(arr[min] > arr[i]){
                    min = i;
                }
            }
            if(min != j){
                var m = 0;
                m = arr[j];
                arr[j] = arr[min];
                arr[min] = m;
          }
        }
执行结果是:array(7)—>[1,2,3,5,5,7,9,]

(原理:第一步:假设第一个数字最小,然后从第二个数开始与假设的最小的数进行比较,如果比它小,就标记,接着与标记的数继续往后比,比到最后一个,找出最小的数,记住该数对应的索引值。

第二步:如果该数的索引值不是最初假设的最小的数的索引值,就交换数值,即将实际上最小的数值放到假定的最小的数的索引位置。继续循环到结束。

通过这两个例子我们大概可以看出来它们的区别,现在我们可以来总结一下它们各自的优化方式。)

冒泡排序的优化:

1,内层优化: 只循环至倒数第二个单元,通过i+1,跟最后一个单元比较。

2,内层优化: 之前比较出的最大值,不再参与下一次的比较。

, 外层优化 : n个单元,只循环n-1次,最后只剩一个单元时,不用循环。

选择排序的优化:

1,内层优化: 之前比较出的最大值,不再参与下一次的比较。,外层优化 : n个单元,只循环n-1次,最后只剩一个单元时,不用循环。

可以看出,在这两种排序方式中,选择排序的效率高于冒泡排序,冒泡排序,触发条件就执行数据交换,数据交换的操作比较繁琐。而选择排序,触发条件只存储索引下标,最后只执行一次数据交换。选择排序的数据交换执行次数也少于 冒泡排序。