使用JavaScript实现几种常用的排序算法

冒泡排序

function BubbleSort(arr){
    if(arr.length<=1){return arr};

    for(let i =0;i<arr.length;i++){
        for(j=i+1;j<arr.length;j++){
            if(arr[i]>arr[j]){
                [arr[i],arr[j]] = [arr[j],arr[i]];
            }
        }
    }

    return arr;
}

快速排序

function quickSort(arr){
  //如果数组<=1,则直接返回
  if(arr.length<=1){return arr;}

  //找基准,并把基准从原数组删除
  let pivotIndex=Math.floor(arr.length/2);
  let pivot=arr.splice(pivotIndex,1)[0];
  
  //定义左右数组
  let left=[];
  let right=[];

  //比基准小的放在left,比基准大的放在right
  for(let 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));
  return [...quickSort(left),pivot,...quickSort(right)];
}

归并排序

function merge(left,right){
    //"治"阶段,合并数组
    let result = [];
    while(left.length>=1&&right.length>=1){
        if(left[0]<right[0]){
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    //将左右数组剩下的也合并
    return result.concat(left).concat(right);
}
function mergeSort(arr){
    //"分"阶段,分离数组
    //递归出口,数组长度为1时,就到了“分”阶段的最底层
    if(arr.length ==1){
        return arr;
    }
    //找出基准点
    let pivot = Math.floor(arr.length/2);
    //分出左右数组(右数组包括基准点)
    let left = arr.slice(0,pivot);
    let right = arr.slice(pivot);
    return merge((mergeSort(left)),mergeSort(right));
}

插入排序

function insertionSort(iArr) {
    var oArr = [iArr[0]];
    var n = iArr.length;
    // 从左边开始,每次拿一个与已排列好的数组进行比较
    for (var i = 1; i < n; i++) {
        for (var j = 0; j < i; j++) {
            if (iArr[i] <= oArr[j]) {
            // 若介于小于该元素,则插入其前方
            oArr.splice(j, 0, iArr[i]);
            break;
            } else if (j === i - 1) {
                // 若比最后一个还大,则排在最右侧
                oArr.push(iArr[i]);
                }
        }
    }
    return oArr;
}

选择排序

function selectSort(arr){
    var len= arr.length,
        minIndex,nu;
    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;//找到每次循环到的最小值,
            }
        }
        nu = arr[i];
        arr[i] = arr[minIndex];//将找到的最小值放在每次循环的最开始的地方;
        arr[minIndex] = nu;

    }
    return arr;
}

希尔排序

function shellSort(arr) {
    for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
      // 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap
      for(let i = gap; i < arr.length; i++) {
        let j = i;
        let temp = arr[j];
        for(; j> 0; j -= gap) {
          if(temp >= arr[j-gap]) {
            break;
          }
          arr[j] = arr[j-gap];
        }
        arr[j] = temp;
      }
    }
    return arr;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大写的转 目录 [冒泡排序][鸡尾酒排序] [选择排序] [插入排序][二分插入排序][希尔排序] [归并排序] ...
    Solang阅读 1,808评论 0 16
  • 排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外...
    文哥的学习日记阅读 1,016评论 2 10
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,215评论 0 52
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,369评论 0 1
  • 感赏昨晚锦明老师亲子语音课和姐妹们的分享,很受益! 投射的前提是要有丰盛的感觉源点,感觉是令人丰盛愉悦的 ,投射不...
    zhzhtydnkshyb阅读 213评论 0 1