使用基础算法,领略算法魅力

// js 利用sort进行排序
  sort可以按照元素的字符编码的顺序进行排序,条件是此元素必须为字符串。对于数字排序,定义规则是很重要的。(比较函数)

systemSort: function(array) {
    return array.sort(function(a, b) {
        return a - b;
    });
},

// 冒泡排序

  冒泡排序
  定义一个变量作为中间值。在两个循环内(i> j),
比较 数组第i位和第j位,如果i小于j,i j利用中间值交换位置。
就是把一个数组中 大个的排在靠前或靠后的位置。
关键词 两个循环, 大个靠前

bubbleSort: function(array) {
    var i = 0,
    len = array.length,
    j, d;
    for (; i < len; i++) {
        for (j = 0; j < len; j++) {
            if (array[i] < array[j]) {
                d = array[j];
                array[j] = array[i];
                array[i] = d;
            }
        }
    }
    return array;
},

// 快速排序
注意地方:
  递归函数的使用 splice返回一个数组 要在函数中设置判断数组是否为1

      var quickSort = function(arr) {
            if (arr.length <= 1) { return arr; }
            var pivotIndex = Math.floor(arr.length / 2);
            var pivot = arr.splice(pivotIndex, 1)[0];
            var left = [];
            var right = [];
            for (var i = 0; i < arr.length; i++){
                if (arr[i] < pivot) {
                    left.push(arr[i]);
                } else {
                    right.push(arr[i]);
                }
            }
            return quickSort(left).concat([pivot], quickSort(right));
        };

// 插入排序
  插入排序类似整理扑克牌,将每一张牌插到其他已经有序的牌中适当的位置。
插入排序由N-1趟排序组成,对于P=1到N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。
简单的说,就是插入排序总共需要排序N-1趟,从index为1开始,讲该位置上的元素与之前的元素比较,放入合适的位置,这样循环下来之后,即为有序数组

insertSort: function(array) {
    //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
    var i = 1,
    j, step, key, len = array.length;

    for (; i < len; i++) {

        step = j = i;
        key = array[j];

        while (--j > -1) {
            if (array[j] > key) {
                array[j + 1] = array[j];
            } else {
                break;
            }
        }

        array[j + 1] = key;
    }

    return array;
},

// 希尔排序
//Jun.array.shellSort(Jun.array.df(10000));
  把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序

shellSort: function(array) {

    // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
    // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
    var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
    //var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
    var i = 0;
    var stepArrLength = stepArr.length;
    var len = array.length;
    var len2 = parseInt(len / 2);

    for (; i < stepArrLength; i++) {
        if (stepArr[i] > len2) {
            continue;
        }

        stepSort(stepArr[i]);
    }

    // 排序一个步长
    function stepSort(step) {

        //console.log(step) 使用的步长统计
        var i = 0,
        j = 0,
        f, tem, key;
        var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len / step;

        for (; i < step; i++) { // 依次循环列
            for (j = 1;
            /*j < stepLen && */
            step * j + i < len; j++) { //依次循环每列的每行
                tem = f = step * j + i;
                key = array[f];

                while ((tem -= step) >= 0) { // 依次向上查找
                    if (array[tem] > key) {
                        array[tem + step] = array[tem];
                    } else {
                        break;
                    }
                }

                array[tem + step] = key;

            }
        }

    }

    return array;

}

  作为一个前端工程师,对于图片和文字的热情是高于算法和逻辑的。但是,在数据大爆炸的今天,对于数据的处理和其处理的方法的效率,也十分重要。(不得不学)
  这两天学完,其实是背着默写,但是,在不断调试bug的过程中,也逐渐被算法的魅力所吸引。所以发几个基础的算法和大家分享。

猜你喜欢

转载自blog.csdn.net/qq_31076033/article/details/81841219