# 各种排序

# 快速排序

思路就是获取一个基准值,小于基准值的到左边, 大于的到右边,然后把结果拼起来即可, 下面的题解可能空间复杂度略高

function quickSort(arr) {
	if (arr.length <= 1) return arr
	// 获取基准值, 比如获取中间值
	// var pivotIndex = Math.floor(arr.length / 2)
	var pivotIndex = 0
	// 获取中间值
	var pivot = arr.splice(pivotIndex, 1)[0]
	var left = []
	var right = []
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] < pivot) {
			left.push(arr[i])
		} else {
			right.push(arr[i])
		}
	}
	return quickSort(left).concat([pivot], quickSort(right))
}

console.log(quickSort([6, 5, 4, 3, 1, 2, 9, 10, 12]))

下面是空间复杂度相对低的实现, 思路是一致的, 找一个基准值,对向指针遍历

function sort(arr, left, right) {
  // 左指针
  let i = left;
  // 右指针
  let j = right;
  // 存放基准值
  let pivot = arr[i];
  while (i < j) {
    // j从右往左找到第一个小于基准的值
    while (arr[j] > pivot && i < j) {
      j--;
    }
    if (i < j) {
      // 将小于基准的值赋值给位置i
      arr[i] = arr[j];
      i++;
    }
    // i从左往往找到第一个小于基准的值
    while (arr[i] < pivot && i < j) {
      i++;
    }
    if (i < j) {
      arr[j] = arr[i];
      j--;
    }
  }
  arr[i] = pivot;
  if (left < i - 1) {
    sort(arr, left, i - 1);
  }
  if (i + 1 < right) {
    sort(arr, i + 1, right);
  }
}

# 归并排序

(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

function sort(arr) {
  if (arr.length < 2) return arr;
  let mid = Math.floor(arr.length / 2);
  let left = arr.slice(0, mid);
  let right = arr.slice(mid);
  return merge(sort(left), sort(right));
}

function merge(left, right) {
  console.log(left, right);
  let result = [];
  let i = 0,
    j = 0;

  while (i < left.length && j < right.length) {
    if (left[i] <= right[j]) {
      result.push(left[i]);
      i++;
    } else {
      result.push(right[j]);
      j++;
    }
  }
  while (i < left.length) {
    result.push(left[i]);
    i++;
  }
  while (j < right.length) {
    result.push(right[j]);
    j++;
  }
  return result;
}

看图应该更好理解, 时间复杂度为O(nlog(n))

# 插入排序

每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。

function insertSort(arr) {
	if (!arr || arr.length === 1) {
		return arr || []
	}
	let result = []
	result.push(arr[0])
	for (let i = 1; i < arr.length; i++) {
		insert(arr[i])
	}

	function insert(val) {
		if (val <= result[0]) {
			result.unshift(val)
			return
		}
		if (val >= result[result.length - 1]) {
			result.push(val)
			return
		}
		for (let i = 0, len = result.length; i < len - 1; i++) {
			if (result[i] < val && val < result[i + 1]) {
				result.splice(i + 1, 0, val)
				break
			}
		}
	}
	return result
}

冒泡之类的就不说了

# 冒泡排序的实现和优化

function bubbleSort(arr) {
	let i = arr.length - 1
	while (i > 0) {
		let pos = 0
		for (let j = 0; j < i; j++) {
			if (arr[j] > arr[j + 1]) {
				pos = j
				const temp = arr[j]
				arr[j] = arr[j + 1]
				arr[j + 1] = temp
			}
    }
		i = pos
	}
}
上次更新: 1/22/2025, 9:39:13 AM