算法入门 常用的五个排序算法
- 冒泡排序
<script>
// 冒泡排序,从头开始一项一项比较
// 双重循环,逐项比较,效率很低
// 升序降序取决于从头遍历还是从尾遍历,和数据交换的条件
let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
bubble(arr)
console.log(arr)
function bubble(arr) {
let len = arr.length;
for (let i = 0; i <= len - 1; i++) {
for (let j = i + 1; j <= len - 1; j++) {
if (arr[i] < arr[j]) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
}
</script>
快速排序
<script>
// 快速排序
// 取每一个区间的中间值,根据对中间值的比较将划数组划分为分左右区间,递归一直到无法划分为止
let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
function quickSorts(arr) {
let len = arr.length;
if (len === 0) return arr;
// 处理下左右两个数组,首先要拿到中值
let midIndex = Math.floor(len / 2);
let midValue = arr.splice(midIndex, 1)[0]; //中间值,如果数组长度是偶数怎那么算的?先存疑问,偶数就是len === 0的情况
let left = [];
let right = [];
for (let i = 0; i < arr.length; i++) {
if(arr[i]<midValue){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return quickSorts(left).concat([midValue], quickSorts(right))
}
console.log(quickSorts(arr))
</script>
- 插入排序
<script>
let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
function insertSrots(arr) {
let len = arr.length
if (len <= 1) return
for (let i = 1; i < len; i++) {
let temp = arr[i];//这个是需要移动的值?
let j = i
// 向前找,看有没有能插入的地方,怎么插入
// 在这层循环中,i没有发生变化,所以不适用于对i下边所映射的元素做改动
// 插入排序相当于要找到下标,找不到下标的情况下,就让整体元素往后移动
// 找到下标就要赋值,判断条件说白了是寻找合适下标的过程
// 包含两个注意点,数组的后移挪位+下标寻找
for (; j >= 0; j--) {
if (temp > arr[j - 1]) {
arr[j] = arr[j - 1]
} else {
break;
// continue;
}
}
arr[j] = temp
}
return arr
}
console.log(insertSrots(arr))
</script>
- 归并算法
<script>
// 归并总共两个步骤,
// 1、拆分数组至最小区间,每次拆分分左右区间
// 2、对最小区间进行合并排序
let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
console.log(mergeSort(arr))
function mergeSort(arr) {
let len = arr.length;
if (len == 1) return arr;
let midIndex = Math.floor(len / 2)
let left = arr.slice(0, midIndex);
let right = arr.slice(midIndex);
return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
let res = []
while (left.length && right.length) {
if (left[0] > right[0]) {
res.push(left[0])
left.shift()
} else {
res.push(right[0])
right.shift()
}
}
if (left.length) {
res=res.concat(left)
} else {
res=res.concat(right)
}
return res
}
</script>
- 插入排序
<script>
// 找到最小(最大)的元素,将其放在末尾(开头),以此达到排序的目的
// 分两步
// 1、找到最小下标
// 2、将其放在开头
let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
console.log(choiceSorts(arr))
function choiceSorts(arr) {
for (let i = 0; i < arr.length; i++) {
let minIndex = i;
for (let j = i; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
if (minIndex === i) continue;
let temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
</script>