javascript冒泡排序、快速排序、插入排序

403 阅读1分钟

javascript冒泡排序、快速排序、插入排序

冒泡排序

遍历数组,如果第前一个值大于后面的,就将前一个值和后一个值做交换,依次向后比较,直到将最大的值放到最后面,这是一次冒泡操作。 重复上一步骤继续执行,直到将整个数组排序好。

function popSort (arr) {
 if (!arr || arr.length <= 1) {
   return arr
 }

 for (let i = 0; i < arr.length - 1; i++) {
   //  arr.length - i 已经排序过的元素不再进行比较
   for (let j = 0; j < arr.length - 1 - i; j++) {
     if (arr[i] > arr[j]) {
       const temp = arr[j]
       arr[j] = arr[i]
       arr[i] = temp
     }
   }
 }
 return arr
}
const arr = [1, 3, 4, 2, 0]
console.log(quickSort(arr))

快速排序

  1. 选择一个中间的位置,拿到当前位置的值。
  2. 遍历数组如果数据大于中间值,将数据添加到右侧数组,否则添加到左侧数组。
  3. 递归左侧和右侧的数组,继续上面的步骤。
    快排是用递归的方法实现的。递归要注意跳出循环的条件,否则容易栈溢出
function quickSort (arr) {
  if (!arr || arr.length <= 1) {
    return arr
  }
  const mini = Math.ceil(arr.length / 2)
  const miniVal = arr.splice(mini, 1)[0]
  let left = []
  let right = []
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < miniVal) {
      left.push(arr[i])
    } else {
      right.push(arr[i])
    }
  }
  return quickSort(left).concat(miniVal, quickSort(right))
}
const arr = [1, 3, 4, 2, 0]
console.log(quickSort(arr))

插入排序

  1. 将数组分为有序区间和无序区间,将数组的第一个数据组成有序区间,其他数据组成无序区间。
  2. 遍历无序数组,与有序数组的值进行对比,如果大于有序数组的末尾,将当前值添加到有序数组的末尾。
  3. 如果小于则继续和有序数组前一位进行比较,直到当前值大于有序数组的值,插入当前值。继续重复前面的步骤
  4. 当无序区间没数据,即只剩下有序区间时,这组数据就变为完全有序。
function insertSort (arr) {
  if (!arr || arr.length <= 1) {
    return arr
  }
  for (let i = 1; i < arr.length; i++) {
    let tmp = arr[i];
    for (let j = i; j >= 0; j--) { // 当前的值,与有序数组中的值进行比较
      if (arr[j - 1] > tmp) {
        arr[j] = arr[j - 1];
      } else {
        arr[j] = tmp; // 比当前值小就赋值到当前位置
        break;
      }
    }
  }
  return arr;
}
const arr = [1, 3, 4, 2, 0]
console.log(insertSort(arr))