网上有这么一个段子之前很是流行:老公一定要找程序员,钱多话少死的早!!!其实最开始听到这个的时候我是拒绝的。因为我也是程序员呀,But我是程序媛……哈哈O(∩_∩)O。

做编程,新技术一直在不断不断地变化,掌握一些基础是未来学习不断更新的技术的坚实基础,尤其是JavaScript,现在不懂JavaScript可以说是寸步难行了吧,讲到JavaScript,面?#21592;?#36739;多问的除了一些基础应该就是算法和数据结构了吧。说到数据结构,小萌初看到这个词的时候,还以为是在说数据库结构,尴尬ing……(原谅自己了,自己学过PHP,学过数据库呢……哈哈(^▽^))今天小萌要分享的就是数据结构中的排序算法了,文章末尾有惊喜哦。

做编程,排序是个必然的需求。前端也不例外,虽然不多,但是你肯定会遇到。之前小呆?#36824;?#20316;面试的时候有跟小萌讲到过排序,但是没有做过多的记录,今天小萌就来补上这篇文章,说到排序,除了原生的sort()方法,还有就是JS十大经典算法排序,但是今天小萌不?#30340;?#20040;多,只?#23548;?#21333;排序的冒泡排序,选择排序和插入排序。复杂今天小萌就简单记录下这几种排序,如果有什么不对的地方,还请各位大大指出?#30784;?/p>

Sort()排序

sort()的定义和用法

  1. sort() 方法用于对数组的元素进行排序。
  2. 语法如下:arrayObject.sort(sortby)
    sortby可选项。规定排序顺序。必须是函数。
  3. 返回值
    为对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
  4. 说明
    如果调用该方法时没有使用?#38382;?#23558;按字母顺序对数组中的元素进行排序,说得更精确点,?#21069;?#29031;字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),?#21592;?#36827;行比较。如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个?#38382;?a 和 b,其返回值如下:
  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。
function sort(){
    var arr = new Array(1,35,2,14,7,8,23,6,19,0);
    arr.sort();
    document.writeln(arr);
}
function sort(){
    var arr = new Array(1,2,35,14,7,8,23,6,19,0);
    arr.sort(function(a,b){
        return a-b});
    document.writeln(arr);
}

冒泡排序

思路:?#26469;?#27604;较相邻的两个元素,如果后一个小于前一个,则?#25442;唬?#36825;样从头到尾一次,就将最大的放到了末尾。要实现上述规则需要用到?#35762;鉬or循环。但是这样有个问题,就是循环结束之后需要从头到尾再来一次,由于每进行一轮,最后的都已经是最大的了,因此后一?#20013;?#35201;比较?#38382;?#21487;?#21592;?#19978;一次少一个。虽然还是可以从头到尾来比较,但是后面的比较是没有意义的无用功,因此为了效率,我们应该对代码进行优化。优化完的代码如下:

var arr = new Array(1,35,2,14,7,8,23,6,19,0);
function sort(){
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) { // 相邻元素两两?#21592;?                var temp = arr[j+1];  // 元素?#25442;?                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

动图演示:
冒泡排序

选择排序

思路:选择排序的思路就比较简单了,?#30475;?#37117;找一个最大或者最小的排在开始就可以了。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;重复第二步,直到所有元素均排序完毕。代码如下:

var arr = new Array(1,35,2,14,7,8,23,6,19,0);
function sort(){
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

动图演示:
选择排序

插入排序

思路:插入排序也比较简单。就像打扑克摸牌的时候按照牌的大小整理牌一样,?#26469;?#23558;拿到的元素插入到正确的位置即可。代码如下:

var arr = new Array(1,35,2,14,7,8,23,6,19,0);
function sort(){
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

动图演示:
插入排序

这三种方法相比呢,冒泡排序是最简单、最慢的,长度小于7的时候使用情况最佳,快速排序相对来说速度就比较快了, 插入排序呢,比冒泡要快,比快速排序慢,数据量小的时候优势比较大。

上面三种都是非常简单的排序方法,简单的同时呢,效率也会比较低,但是对于我们日常工作应该是没有问题了,但是如果看官大大rws公司具有大数据的排序,那小萌真的?#21069;?#33707;能助了……到这里就ending了。如果有什么问题大家请在评论里提出哦……共同进步。

当当当当…你以为真的结束了吗?NO!福利来了……今天是感恩节,谢谢各位看官大大对小呆小萌博客的支持,特发一个红包?#21592;?#35874;意,在支付宝红包输入口令“小呆小萌祝快乐”就可领取红包啦……