一、排序算法的分类

1.插入类排序

军训时,在一只有序队伍中,新来一个,教官要求新来的迅速找到自己的位置。

例:直接插入排序折半插入排序

 

2.交换类排序

军训刚开始,一群新生需要排队,教官说,“你比你旁边的高,你俩换一下,怎么换完还高,再换......”

例:冒泡排序快速排序

 

3.选择类排序

每一趟选出最小(或最大)的一个。比如军训排队,教官说,“你们都别动,我看看谁个字最小,你和第一个换一下,剩下的我继续选......”

例:简单选择排序堆排序

 

4.归并类排序

将两个或两个以上的有序序列合并成一个新的有序序列。继续军训排队,教官让每个人和旁边的人组成一个二人组,二人组内部先排好,二人组再和旁边的二人组组成新的四人组,依旧内部排序...... 最终会合并到一个组。

例:二路归并排序

 

5.基数类的排序

基于多关键字排序的思想。例如,一副去掉大小王的52张扑克牌进行基数排序,先按花色(红桃、黑桃、方片、梅花)排序,这样分成了4堆,然后每一堆从 A 到 K 排序。

 

二、JavaScript排序算法实现

1.直接插入排序

let arr = [49, 38, 65, 97, 76, 13, 27, 49]
let i = 0
let temp, j
let n = arr.length
/*非递减排序*/
for (i+1; i<n; i++) {
    temp = arr[i]
    j = i-1
    while (j>=0 && temp<arr[j]) {
        arr[j+1] = arr[j]
        --j
    }
    arr[j+1] = temp
}
console.log(arr)     //[13, 27, 38, 49, 49, 65, 76, 97]

2.希尔排序

let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
let gaps = [5, 3, 1]
let i = 0, j = 0, n = 0, temp
/*非递减排序*/
for (n; n<gaps.length; n++) {
    for (i=gaps[n]; i<arr.length; i++) {
        temp = arr[i]
        for (j=i; j>=gaps[n] && arr[j-gaps[n]]>temp; j=j-gaps[n]) {
            arr[j] = arr[j-gaps[n]]
        }
        arr[j] = temp
    }
}

 

3.冒泡排序

let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
let i = 0
let j = 0
/*非递减排序*/
for (i; i<arr.length; i++) {
    for (j=i+1; j<arr.length; j++) {
        if (arr[i]>arr[j]) {
            let k = arr[i]
            arr[i] = arr[j]
            arr[j] = k 
        }
    }
}

4.快速排序

let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
/*非递减排序*/
function quickSort (arr_) {
    let left =[]
    let right = []
    let m, temp
    let i=0
    if (arr_.length<=1) {
        return arr_
    }
    m = Math.floor(arr_.length/2)
    temp = arr_.splice(m, 1)
    for (i; i<arr_.length; i++) {
        if (arr_[i]<temp) {
            left.push(arr_[i])
        } else {
            right.push(arr_[i])
        }
    }
    console.log('left:'+left)
    console.log('right:'+right)
    console.log('temp:'+temp)
    return quickSort(left).concat(temp, quickSort(right))
}
console.log(quickSort(arr))

5.选择排序

let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
let i = 0
let j = 0
let k, temp
/*非递减排序*/
for (i; i<arr.length; i++) {
    min_ = arr[i]
    k = i
    for (j=i+1; j<arr.length; j++) {
        if (arr[j]<min_) {
            min_ = arr[j]
            k = j
        }
    }
    temp = arr[i]
    arr[i] = min_
    arr[k] = temp
}
console.log(arr)

 

分类参考天勤计算机考研高分笔记系列第8版,2020版数据结构

JavaScript算法参考简书 https://www.jianshu.com/p/da9e31c485c2