目录
[1]快排
<script>
// 快排
// 原理:使用递归,确定递归边界:开始位置>=结束位置
// 先将开始位置的数据保存----比开始位置数据大的放在右边,比开始位置小或者小于开始位置的放在左边;
function getNum (arr, i, j) {
// 二分查找使用的递归,确定递归边界
if (i >= j) {
return
}
let mid = arr[i]
let left = i
let right = j
while (left < right) {
// 先从右指针开始比较的原因:左边第一个数据(也就是目前左指针的位置)已经保存了,可以覆盖
while (arr[right] > mid && left < right) {
right--
}
arr[left] = arr[right]
while (arr[left] <= mid && left < right) {
left++
}
arr[right] = arr[left]
}
arr[left] = mid
getNum(arr, left + 1, j)
getNum(arr, i, left - 1)
}
let arr = [5, 6, 8, 3, 2, 1]
getNum(arr, 0, arr.length - 1)
console.log(arr)
</script>
[2]冒泡
<script>
// 冒泡原理:两层for循环
// 第一层:表示排序次数,(每排序一次,有一个数据有序,最后一个自动有序)
// 第二层:两两进行比较
function sort (arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let t = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = t
}
}
}
}
let arr = [1, 5, 3, 1, 6, 7, 8, 3, 2]
sort(arr)
console.log(arr)
</script>
[3]选择排序
<script>
// 选择排序原理:从所有无序数据找出最大/最小的(下标为i之前的数据有序),与i进行交换(双层for循环)
function sort (arr) {
for (let i = 0; i < arr.length - 1; i++) {
let flag = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[flag]) {
flag = j
}
}
let t = arr[i]
arr[i] = arr[flag]
arr[flag] = t
}
}
let arr = [1, 5, 3, 1, 6, 7, 8, 3, 2]
sort(arr)
console.log(arr)
</script>
[4]插入排序
<script>
// 插入排序---扑克牌原理
// 遍历每一个元素 ,将当前元素与其前面的元素作比较,若是比其大/小就插入,否则就继续向前比较
// 只要是前面还有数据就进行比较
function sort (arr) {
let perIndex // 前一个数的下标
let current // 当前元素
for (let i = 0; i < arr.length; i++) {
perIndex = i - 1
current = arr[i]
// 只要还没有找到比起小的元素,就继续向前寻找至下标为0
while (perIndex >= 0 && arr[perIndex] > current) {
// 元素后移动
arr[perIndex + 1] = arr[perIndex]
perIndex--
}
// 找到--插入
arr[perIndex + 1] = current
}
}
let arr = [1, 5, 3, 1, 6, 7, 8, 3, 2]
sort(arr)
console.log(arr)
</script>