javascript冒泡排序、快速排序、插入排序
冒泡排序
遍历数组,如果第前一个值大于后面的,就将前一个值和后一个值做交换,依次向后比较,直到将最大的值放到最后面,这是一次冒泡操作。 重复上一步骤继续执行,直到将整个数组排序好。
function popSort (arr) {
if (!arr || arr.length <= 1) {
return arr
}
for (let i = 0; i < arr.length - 1; i++) {
// arr.length - i 已经排序过的元素不再进行比较
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[i] > arr[j]) {
const temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
}
}
}
return arr
}
const arr = [1, 3, 4, 2, 0]
console.log(quickSort(arr))
快速排序
- 选择一个中间的位置,拿到当前位置的值。
- 遍历数组如果数据大于中间值,将数据添加到右侧数组,否则添加到左侧数组。
- 递归左侧和右侧的数组,继续上面的步骤。
快排是用递归的方法实现的。递归要注意跳出循环的条件,否则容易栈溢出
function quickSort (arr) {
if (!arr || arr.length <= 1) {
return arr
}
const mini = Math.ceil(arr.length / 2)
const miniVal = arr.splice(mini, 1)[0]
let left = []
let right = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < miniVal) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat(miniVal, quickSort(right))
}
const arr = [1, 3, 4, 2, 0]
console.log(quickSort(arr))
插入排序
- 将数组分为有序区间和无序区间,将数组的第一个数据组成有序区间,其他数据组成无序区间。
- 遍历无序数组,与有序数组的值进行对比,如果大于有序数组的末尾,将当前值添加到有序数组的末尾。
- 如果小于则继续和有序数组前一位进行比较,直到当前值大于有序数组的值,插入当前值。继续重复前面的步骤
- 当无序区间没数据,即只剩下有序区间时,这组数据就变为完全有序。
function insertSort (arr) {
if (!arr || arr.length <= 1) {
return arr
}
for (let i = 1; i < arr.length; i++) {
let tmp = arr[i];
for (let j = i; j >= 0; j--) { // 当前的值,与有序数组中的值进行比较
if (arr[j - 1] > tmp) {
arr[j] = arr[j - 1];
} else {
arr[j] = tmp; // 比当前值小就赋值到当前位置
break;
}
}
}
return arr;
}
const arr = [1, 3, 4, 2, 0]
console.log(insertSort(arr))