JavaScript --数据排序算法(2)

选择排序

算法思想:从所有记录中选出最小的一个数据元素与第一个位置的记录交换;
然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。

---上代码----

let arrTemps = [3, 2, 11, 9, 2, 15, 19, 19, 16, 1, 8]
function select(arr) {
  var currentIndex; //当前记录的初始位置
  var temp;         //换值容器
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    currentIndex = i //默认是最外层的
    for (var j = i + 1; j < len; j++) {
      if (arr[j] < arr[currentIndex]) {
        // 将记录的值 再依次进行对比 确认出最小值的位置并记录
        // 如果要更换成降序的话  换成大于即可
        currentIndex = j
      }
    }
    // 交换位置
    // 将最外层的循环的值 与对比获取的位置进行交换
    temp = arr[i]
    arr[i] = arr[currentIndex]
    arr[currentIndex] = temp
  }
  return arr
}
console.log(select(arrTemps), '选择排序');

这个有点类似冒泡排序,冒泡排序是相邻的比较,选择排序是在当前位置与后面的所有进行比较取出当前的最大值/最小值

插入排序

算法思想:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置, 每次外循环结束后,将当前的数插入到合适的位置。

---上代码----

let arrTempsp = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8]

function insert(arr) {
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i];  //当前对比的值
    let j = i - 1       //往当前位置前一位的位置
    while (arr[j] > item) {
      //升序
      // 要插入的值 进行对比 大于的话 直接交换位置,整体向右移位
      //降序  换成 小于
      arr[j + 1] = arr[j];
      j--;  //记录当前位置往前
    }
    // 插入记录位置的后一位索引
    arr[j + 1] = item
  }
  return arr
}
console.log(insert(arrTempsp), '插入排序');

插入排序是从第二个起,每次都是往前进行查找相应的位置进行插入,有点类似于来一个元素 在之前排好的元素中进行插入

归并排序

算法思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
---上代码----

let arrTe = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8]

function merge(arr) {
  if (arr.length <= 1) {  //使用递归的,结束条件
      return arr
  }
  let mid = Math.floor(arr.length / 2)
  let left = merge(arr.slice(0,mid))  //进行递归二分,形成最小的单元
  let right = merge(arr.slice(mid))    //进行递归二分

  console.log(left,right);

  // 排序  最小单元是数组的形式
  function sort(left,right){
    let result=[]
    while(left.length>0&&right.length>0){
      // 对比数组的第一个  小的那个数组截取第一个 添加到result中
      // 直至一个数组为空 跳出循环
      if (left[0]>right[0]) {
        result.push(left.shift())
      }else{
        result.push(right.shift())
      }
    }
    // result是排序好的单元,在left 或right中存在一个最大值 需要拼接在一起
    return [...result,...left,...right]
  }
  return sort(left,right)
}

console.log(merge(arrTe), '归并排序');

归并排序有点像快速排序,进行二分的 递归的形式,实现最小单元的排序,最终合并成。

小编用的相对比较多的还是前面的两种--冒泡排序和快速排序

posted @ 2022-08-09 14:45  xiao旭  阅读(28)  评论(0编辑  收藏  举报