数组排序

149 阅读2分钟

冒泡排序

当前项和后一项进行比较(两两比较)如果当前项大于后一项就交换位置

  • 思路

1.比较相邻的两个的元素,如果当前元素大于后一项 则交换位置

2.对每一对相邻两项,从开始第一对到结尾的最后一对。每一轮比较结束后,都会有一个最大的数排在后面

3.随着每轮的比较,越来越少的元素重复上面的步骤(后面排列着之前几轮每轮比较出来的最大数),直到没有任何一对数字需要比较。

//创建一个数组
var arr = [34,25,12,65,17];
functon fe(ary) {
// 比较的轮数
    for(var i = 0; i < ary.length - 1; i++) {
    //比较i轮 那么在数组里 就已经有i个最大的,下一轮比较时 没必要再和这i个值进行比较了
        //比较的次数
        for(var j = 0; j < ary.length - 1 - i; j++) {
        //如果前一项大于后一项则交换位置
            if(ary[i] > ary[j + 1]) {
                var n = ary[j];
                ary[j] = ary[j + 1];
                 ary[j+1] = n;
            }
        }
    }
    return ary;
}
console.log(fe(arr));

快速排序

  • 快速排序的原理:声明两个新数组,分别叫做left(左)和right(右),获取当前数组的中间项,比中间项小的放在left中,比中间项大的放在right。然后对left和right进行同样的操作,直到当前数组只有一项或者为空时,终止这个过程,然后把所有的left和right以及中间项拼接起来。
var arr = [29, 10, 34, 40, 18];
function qu(ary) {
    // !!!! 使用递归要注意递归终止的条件:当前数组ary只要一项或者为空
    if (ary.length <= 1) {
        return ary;
    }
    // 1. 计算中间相索引
    var middleIndex = Math.floor(ary.length / 2);
    // 2. 获取中间项
    var middleVal = ary.splice(middleIndex, 1)[0];
    // 3. 声明left和right
    var left = [];
    var right = [];

    // 4. 循环比较数组项和中间项的大小
    for (var i = 0; i < ary.length; i++) {
        var cur = ary[i];

        // 用当前项和中间项比较,如果大就push到right,left
        if (cur > middleVal) {
            right.push(cur);
        } else {
            left.push(cur);
        }
    }

  return quickSort(left).concat(middleVal, quickSort(right));
}
console.log(qu(arr));// [10, 18, 29, 34, 40]

插入排序

插入排序原理:

  1. 假定第一项是最小值;
  2. 从第二项开始,从该项开始和前面的项进行比较
  3. 如果前面一项比后一项大,则交换位置
var ary = [5, 4, 3, 2, 1];
function insertSort(ary) {
  for (var i = 1; i < ary.length; i++) {
    for (var j = i; j > 0; j--) {
      if ( ary[j - 1] > ary[j]) {
        var temp = ary[j];
        ary[j] = ary[j - 1];
        ary[j - 1] = temp;
      }
    }
  }
  return ary;
}
console.log(insertSort(ary));