js实现常用排序算法

javascript实现常用排序算法

包括冒泡排序、插入排序、希尔排序、选择排序、快速排序等常用排序算法

1.冒泡排序

var bubbleSort = function (arr) {
  const n = arr.length
  let temp
  for(let i = 0; i < n; i++) {
    let flag = false  // flag用来标记本趟循环是否发生了交换
    for(let j = 0; j < n - i; j++) {
      if(arr[j] > arr[j + 1]) {
        temp = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = temp
        flag = true
      }
    }
    // 如果一趟循环下来没发生交换,说明已经有序
    if(!flag) {
      return arr
    }
  }
}

const arr = [2, 1, 5, 3, 8, 4, 7, 6]
console.log(bubbleSort(arr))

2.插入排序

var insertSort = function(arr) {
  const n = arr.length
  let temp
  // 从数组的第二个值开始,往前面插
  for(let i = 1; i < n; i++) {
    // i 为待排序元素的下标,用temp暂存,因为一会儿如果右移元素的话,会覆盖
    temp = arr[i]
    // j为已排完序的最后一个元素的下标,也是待排序元素的前一个元素
    j = i - 1
    while(j >= 0 && temp < arr[j]) {
      // 将j右移,留出空位
      arr[j + 1] = arr[j]
      j--
    }
    // while循环结束,即循环结束位置的元素要比插入的元素小或者相等
    // 所以循环结束位置的下一个位置就是要插入的位置
    arr[j + 1] = temp
  }
  return arr
}

const arr = [2, 1, 5, 3, 8, 4, 7, 6]
console.log(insertSort(arr))

3.希尔排序

var shellSort = function (arr) {
  const n = arr.length
  // gap为增量
  for(let gap = Math.floor(n / 2); gap >= 1; gap = Math.floor(gap / 2)) {
    // 下边用的就是插入排序的原理
    // 从增量开始递增,可以遍历到从增量开始的前 增量 个元素
    // 依次递增,每一个元素的前增量个元素都可以遍历到,即每个元素都可以按增量遍历排序一次
    for(let i = gap; i < n; i++) {
      let temp = arr[i]
      let j = i - gap
      while(j >= 0 && temp < arr[j]) {
        arr[j + gap] = arr[j]
        j -= gap
      }
      arr[j + gap] = temp
    }
  }
  return arr
}

const arr = [2, 1, 5, 3, 8, 4, 7]
console.log(shellSort(arr))

4.选择排序

var selectSort = function(arr) {
  const n = arr.length
  var temp
  for(let i = 0; i < n; i++) {
    let minIdx = i
    for(let j = i + 1; j < n; j++) {
      if(arr[j] < arr[minIdx]) {
        minIdx = j
      }
    }
    temp = arr[i]
    arr[i] = arr[minIdx]
    arr[minIdx] = temp
  }
  return arr
}

const arr = [2, 1, 5, 3, 8, 4, 7, 6]
console.log(selectSort(arr))

5.快速排序

/**
 * arr:待排序数组
 * 从arr[low]到arr[high]的元素排序 
 */
var quickSort = function(arr, low, high) {
  let i = low, j = high
  if(low < high) {
    let temp = arr[low]
    // 这个循环完成一趟排序,即数组中小于temp的关键字在temp左侧,大于temp的关键字在temp右侧
    while(i < j) {
      // 从右往左扫描,找比temp小的关键字
      while(i < j && arr[j] >= temp) 
        --j
      if(i < j) {
        arr[i] = arr[j]
        ++i
      }
      // 从左往右扫描,找比temp大的关键字
      while(i < j && arr[i] <= temp)
        ++i
      if(i < j) {
        arr[j] = arr[i]
        --j
      }
    }
    arr[i] = temp // 将temp放入最终位置
    quickSort(arr, low, i - 1)  // 递归对 temp 左边的关键字进行排序
    quickSort(arr, i + 1, high)  // 递归对 temp 右边的关键字进行排序
  }
  return arr
}

const arr = [2, 1, 5, 3, 8, 4, 7]
console.log(quickSort(arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值