你必须了解的排序算法

380 阅读1分钟

冒泡排序 O(n2)O(n^2)

【算法】排序算法之冒泡排序

bubbleSort.gif

function bubbleSort(arr) {
	const len = arr.length
	for(let i=0; i<len; i++) {
		for(let j=0; j<len-1; j++) {
			if(arr[j]>arr[j+1]) [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
		}
	}
	return arr
}

选择排序 O(n2)O(n^2)

【算法】排序算法之选择排序

selectionSort.gif

function selectSort(arr) {
	const len = arr.length
	let minIndex
	for(let i=0; i<len-1; i++) {
		minIndex = i
		for(let j=i; j<len; j++) {
			if(arr[j]<arr[minIndex]) minIndex = j
		}
		if(minIndex !== i) [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
	}
	return arr
}

插入排序 O(n2)O(n^2)

【算法】排序算法之插入排序

insertionSort.gif

function insertSort(arr) {
	for(let i=1; i<arr.length; i++) {
		let j = i
		while(j>=1 && arr[j-1] > arr[j]) {
			[arr[j-1], arr[j]] = [arr[j], arr[j-1]]
			j--
		}
	}
	return arr
}

快排 O(nlogn)O(n2)O(nlogn)-O(n^2)

【算法】排序算法之快速排序

v2-d4e5d0a778dba725091d8317e6bac939_b.gif

function quickSort(arr) {
	const len = arr.length
	if(len<2) return arr
	const cur = arr[len-1]
	const left = arr.filter((value, index) => value <= cur && index !== len-1)
	const right = arr.filter(value => value > cur)
	return [...quickSort(left), cur, ...quickSort(right)]
}

归并排序 O(nlogn)O(nlogn)

【算法】排序算法之归并排序

v2-a29c0dd0186d1f8cef3c5ebdedf3e5a3_b.gif

function merge(left, right) {
  let res = []
  let i = 0
  let j = 0
  while(i<left.length && j<right.length) {
    if(left[i] < right[j]) {
      res.push(left[i])
      i++
    } else {
      res.push(right[j])
      j++
    }
  }
  if(i<left.length) {
    res.push(...left.slice(i))
  } else {
    res.push(...right.slice(j))
  }
  return res
}

function mergeSort(arr) {
  const len = arr.length
  if(len<2) return arr
  const mid = Math.floor(len/2)
  const left = mergeSort(arr.slice(0, mid))
  const right = mergeSort(arr.slice(mid))
  return merge(left, right)
}