javascript排序算法

冒泡排序

冒泡排序的主要思想是,按照某一顺序(从后向前或从前向后)逐一比较相邻的元素,按照规定的条件交换元素位置,每次循环可以确定一个元素的最终位置,所以冒泡排序在外层共需要数组长度-1次的循环来确定所有元素的正确位置。有如下一个数组:

var arr = [5,7,10,3,4,6,20,9,0];

如下图,我们从后向前循环,第一次循环比较完之后,0会被换到第一个位置上:

以此类推,要进行N-1次的循环,就能完成排序。

function bubbleSort(arr){
  var len = arr.length, i, j;
  // 外层循环次数为数组长度-1
  for(i = len - 1; i >= 1; i--){
      //内层循环交换元素,循环长度最开始为数组长度,依次递减
    for(j = 0; j <= i - 1; j++){
        //满足条件交换位置
      if(arr[j] > arr[j + 1]){
        d = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = d;
      }
    }
  }
  return arr;
}

快速排序

首先选出一个关键值,以这个值为基准,循环遍历数组,将数组分成比关键值大的一组(left)比关键值小的一组(right),之后再递归调用方法,直到传入的数组长度为1时,直接返回,并按照left,关键值,right将数组进行连接,实现排序。
如下图所示:

代码实现如下:

function quickSort(arr){
  if(arr.length <= 1) return arr;
  //关键值索引
  var pivotIndex = Math.floor(arr.length/2)
      // 获取关键值
    , pivot = arr.splice(pivotIndex, 1)[0]
    // 根据关键值分组
    , left = []
    , 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));
}

归并排序

归并排序首先要将待排序的数组进行分解,分解成多个单元素的数组,之后先进行两两比较,确定顺序后合并,再将合并后的数组进行两两比较,确定顺序并合并,直到所有数组合并完成。如下图:

分组:

归并排序:

代码实现:

function mergeSort (items) {
    //递归分组,分组到每组只有一个元素,返回该数组
    if(items.length==1){
        return items;
    }
    var middle=Math.floor(items.length/2),
    left=items.slice(0,middle),
    right=items.slice(middle);
    return merge(mergeSort(left),mergeSort(right));
}

function merge (left,right) {
    //排序,先比较一个值得数组之间的大小,并进行排序,之后递归结果
    var result=[];
    while(left.length>0 && right.length>0){
        //单个元素时只比较0位置的元素,多个时是已经排好顺序的,所以也
        if(left[0]<right[0]){
        /*shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。*/
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    return result.concat(left).concat(right);
}