【算法】排序方法总结及简单js实现

所有排序默认从小到大

冒泡排序

// 相邻元素比较,替换。每次确定一个最大/最小值,最值在数组最后一个
function bubbleSort(arr){
  for(let i=0;i<arr.length;i++){
    // 外循环控制次数
    for(let j=0;j<arr.length-1-i;j++)
      // 内循环进行相邻值比较替换
      if(arr[j] > arr[j+1]){
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
      }
  }
  return arr;
}

插入排序

// 从数组首部开始构建有序数列,后面的元素按序插入首部,并入有序数列。
function insertSort(arr){
  for(let i=1;i<arr.length;i++){
    // 外部循环确定基准(即首部有序数列后的第一个元素)
    let temp = arr[i];
    for(let j=i;j>=0;j--){
      // 内部循环通过从后往前一点一点比较,将基准元素插入合适位置。
      if(temp < arr[j-1]){
        arr[j] = arr[j-1];
      }else{
        arr[j] = temp;
        break;
      }
    }
  }
  return arr;
}

快速排序

// 用递归方法。利用基准元素,将数组分成左(元素均小于基准)右(元素均大于基准)数组。
function quickSort(arr){
  if(arr.length <= 1){
    return arr;
  }
  var left = [], right = [];
  var temp = arr[0];
  for(let i=1; i<arr.length;i++){
    if(arr[i] > temp){
      right.push(arr[i]);
    }else{
      left.push(arr[i]);
    }
  }
  return quickSort(left).concat(temp, quickSort(right));
}

选择排序

// 也是使首部有序。每一轮遍历都找出最大/小值,放入首部末尾。
function selectSort(arr){
  var minIndex = 0;
  for(let i=0;i<arr.length - 1;i++){
    minIndex = i;
    for(let j=i+1;j<arr.length;j++){
      if(arr[minIndex]>arr[j]){
        minIndex=j;
      }
    }
    [arr[minIndex], arr[i]] = [arr[i], arr[minIndex]];
  }
  return arr;
}

归并排序

// 也是使首部有序。每一轮遍历都找出最大/小值,放入首部末尾。
function merge(left, right){
  var temp =[];
  while(left.length && right.length){
    if(left[0] > right[0]){
      temp.push(right.shift());
    }else{
      temp.push(left.shift());
    }
  }
  return temp.concat(left, right);
}
function mergeSort(arr){
  var len = arr.length;
  if(len < 2){
    return arr;
  }
  var mid = Math.floor(len/2), left = arr.slice(0, mid), right =arr.slice(mid);
  return merge(mergeSort(left), mergeSort(right));
}
posted @ 2022-06-24 00:52  leah-xx  阅读(28)  评论(0编辑  收藏  举报