常见排序算法
插入排序
function sort(arr) {
if (!arr.length || arr.length <=1) return arr
for (let i = 1; i< arr.length; i++) { // 假设第一个已经被定了
let j = i - 1 // 找到上一位已经排序好的项目进行开始对比
let item = arr[i] // 记录一下当前这个值
while(j >=0 && arr[j] > item ) { // 往前对比,j>=0;且所对比的数值如果大于当前数值的话
// 说明还可以往下走、并且将对比的值和当前值调换一下位置
arr[j+1] = arr[j]
j--
}
// 直到遍历完,确认到j的值、将当前的值赋给j所在的位置
arr[j+1] = item // 因为最后一下j--,所以当前的值需要补多一位才是真实的j位置
}
}
快速排序
function sort(arr) {
let len = arr.length
if (len <=1) return (arr || [])
let left = [], right = [], pivot = Math.floor(len/2);
for (let i =0; i< len; i++) {
if (arr[i] <=arr[pivot]) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return sort(left).concat(arr[pivot], sort(right))
}
冒泡排序
// 从前面往后面确认
function sort(arr) {
let len = arr.length
if (len <=1) return (arr || [])
for (let i =0; i<len; i++) {
for (let j= i+1; j< len; j++) {
if (arr[i] > arr[j]) {
[arr[i], arr[j]] = [arr[j], arr[i]] // 交换值
}
}
}
return arr
}
// 相近的两两对比
function sort(arr) {
let len = arr.length
if (len <=1) return (arr || [])
for(let i = 0; i<len - 1; i++) {
for (let j = 0; j< len - 1 -i; j++) { // 因为在对比中会出现arr[j+1],往后取多一位,所以len-1是需要的,不然会报错
if (arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}
选择排序
function sort () {
let len = arr.length
if (len <=1) return (arr || [])
for (let i=0; i<len; i++) {
let index = i
for (let j=i+1; j<len;j++) {
if (arr[j]<arr[i]) {
index = j
}
}
[arr[i], arr[index]] = [arr[index], arr[i]]
}
return arr
}
希尔排序
function shellsort(arr) {
let len = arr.length
if(len<=1) return arr
for(let gap = Math.floor(len/2); gap >=1;gap = Math.floor(gap/2)) { // 遍历gap
// 拿到gap后,针对分组进行按照插入排序法处理
for(let i = gap; i<len; i++) {
// 下面思维是插入算法的思维,获取当前下标数据和上一个进行大小对比
let current_ele = arr[i] // 第一次循环获取这一组中的下标为1的数,往前对比;后续循环可以理解为获取下一个
let before_index = i - gap // 第一次循环获取这一组中上一个0个,后续循环可以理解为相对i的上一个,
while (before_index >= 0 && arr[before_index] > current_ele) {
arr[before_index + gap] = arr[before_index] // 将大的数据往后挪一个空位
before_index -= gap
}
arr[before_index + gap] = current_ele // 将数据插入合适的index位置
}
}
return arr
}
归并排序
function merge (left, right) {
let result = []
while(left.length && right.length) {
// 获取数组的第一个,并且改变原有数组的长度
if (left[0] < right[0]) {
reuslt.push(left.shift())
} else {
reuslt.push(right.shift())
}
}
if (left.length) result = result.concat(left)
if (right.length) result = result.concat(right)
return result
}
function sort(arr) {
let len = arr.length
if (len < 2) return arr
// 找到二分位置
let midIndex = Math.floor(len/2)
let left = arr.slice(0, midIndex)
let right = arr.slice(midIndex, len)
return merge(sort(left), sort(right)) // 递归调用
}
参考:图文详解_