冒泡排序
/**
* 冒泡排序的过程,就是从第一个元素开始,重复比较相邻的两个项,若第一项比第二项更大,则交换两者的位置;反之不动。
每一轮操作,都会将这一轮中最大的元素放置到数组的末尾。假如数组的长度是 n,那么当我们重复完 n 轮的时候,整个数组就有序了
* @describe:
* @param {*}
* @return {*}
*/
//初级
function bubbleSort(arr) {
// 缓存数组长度
const len = arr.length
// 外层循环用于控制从头到尾的比较+交换到底有多少轮
for (let i = 0
// 内层循环用于完成每一轮遍历过程中的重复比较+交换
for (let j = 0
// 若相邻元素前面的数比后面的大
if (arr[j] > arr[j + 1]) {
// 交换两者
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
// 返回数组
return arr
}
//中级
function bubbleSort1(nums) {
for (let i = 0
// 区别在这里,我们加了一个标志位
let exchange = false
// 注意差别在这行,我们对内层循环的范围作了限制
for (let j = 0
if (nums[j] > nums[j + 1]) {
[nums[j], nums[j + 1]] = [nums[j + 1], nums[j]]
// 只要发生了一次交换,就修改标志位
exchange = true
}
}
// 若一次交换也没发生,则说明数组有序,直接放过
if (!exchange) return nums
}
return nums
}
//高级
function bubbleSort2(arr) {
var i = arr.length - 1
while (i > 0) {
var pos = 0
for (var j = 0
if (arr[j] > arr[j + 1]) {
pos = j
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
i = pos
}
return arr
}
// var arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
// console.log(bubbleSort2(arr))
选择排序
/**
* @describe: 选择排序的关键字是“最小值”:循环遍历数组,每次都找出当前范围内的最小值,把它放在当前范围的头部;然后缩小排序范围,继续重复以上操作,直至数组完全有序为止。
* @param {*} nums
* @return {*}
*/
function selectSort(arr) {
// 缓存数组长度
const len = arr.length
// 定义 minIndex,缓存当前区间最小值的索引,注意是索引
let minIndex
// i 是当前排序区间的起点
for (let i = 0
// 初始化 minIndex 为当前区间第一个元素
minIndex = i
// i、j分别定义当前区间的上下界,i是左边界,j是右边界
for (let j = i
// 若 j 处的数据项比当前最小值还要小,则更新最小值索引为 j
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
// 如果 minIndex 对应元素不是目前的头部元素,则交换两者
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
}
return arr
}
// console.log(selectSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]))
插入排序
function insertSort(arr) {
const len = arr.length
let temp
for (let i = 1; i < len; i++) {
let j = i
temp = arr[i]
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1]
j--
}
arr[j] = temp
}
return arr
}
归并排序
function mergeSort(arr) {
const len = arr.length
if (len <= 1) return arr;
const mid = Math.floor(len / 2)
const leftArr = mergeSort(arr.slice(0, mid))
const rightArr = mergeSort(arr.slice(mid, len))
arr = mergeArr(leftArr, rightArr)
return arr
}
function mergeArr(arr1, arr2) {
let i = 0, j = 0
const res = []
const len1 = arr1.length
const len2 = arr2.length
while (i < len1 && j < len2) {
if (arr1[i] < arr2[j]) {
res.push(arr1[i])
i++
} else {
res.push(arr2[j])
j++
}
}
if (i < len1) {
return res.concat(arr1.slice(i))
} else {
return res.concat(arr2.slice(j))
}
}
快速排序
function quickSort(arr, left = 0, right = arr.length - 1) {
if (arr.length > 1) {
const lineIndex = partition(arr, left, right)
if (left < lineIndex - 1) {
quickSort(arr, left, lineIndex - 1)
}
if (lineIndex < right) {
quickSort(arr, lineIndex, right)
}
}
return arr
}
function partition(arr, left, right) {
let pivotValue = arr[Math.floor(left + (right - left) / 2)]
let i = left
let j = right
while (i <= j) {
while (arr[i] < pivotValue) {
i++
}
while (arr[j] > pivotValue) {
j--
}
if (i <= j) {
swap(arr, i, j)
i++
j--
}
}
return i
}
function swap(arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}