JS常见排序算法总结:冒泡排序、快速排序、插入排序

595 阅读1分钟

冒泡排序

原理分析: 依次比较两个相邻的值,如果后者较小,则交换两者的顺序,让最大的值排在最后。
视频讲解链接

const arrBuble = [911, 520, 888, 2323, 666, 555];
function bubleSort(arr =[]){
    //外层循环控制比较的轮数,两两比较只要比较length-1次
    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]){
                //使用ES6结构赋值交换顺序
                [arr[j],arr[j+1]]=[arr[j+1],arr[j]]
            }
        }
        //打印每一轮比较的结果
        // console.log(arr);
    }
    return arr;
}
console.log(`冒泡排序最后结果:`+bubleSort(arrBuble))

快速排序

原理分析:里面使用到了递归思想
1.新建两个空数组leftright
2.然后找到数组的基准值,point = arr[Math.floor(arr.length/2)],
3.遍历数组的每一项,小于这个基准值的项放到left数组,大于基准值的放到right数组
4.然后按照步骤23,递归上面leftright数组
5.最后将left、基准值和right数组用concat拼接起来
    
const arrQuick = [911, 520, 888, 2323, 666, 555];
function quickSort(arr =[]) {
    if (arr.length <= 1) {
        return arr;
    }
    let left = [], right = [];
    let pivot = arr[Math.floor(arr.length / 2)];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else if(arr[i] > pivot){
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([pivot], quickSort(right));
}
console.log(`快速排序最后结果:` + quickSort(arrQuick));

插入排序

原理分析

一个待排序的数组类比抽取扑克牌然后插入已排好序的手中扑克牌。假设手中三项是已经从小到大排序好的扑克牌, 现在取第四张扑克牌(i=4),然后将第四张扑克牌(j=i)与前面已排好序的扑克牌比较,若arr[j]<arr[j-1],则交换位置, 下一轮,j--。注意交换条件是:小的值交换到前面去。

const arrInsert = [911, 520, 888, 2323, 666, 555];
function insertSort(arr=[]){
    for(let i=1; i< arr.length;i++){
        //里面循环控制每一轮比较的次数
        for(let j = i; j >0 ;j--){
            if(arr[j] < arr[j-1]){
                //使用ES6结构赋值交换顺序
                [arr[j],arr[j-1]]=[arr[j-1],arr[j]]
            }
        }
    }
    return arr;
}
console.log(`插入排序最后结果:` + insertSort(arrInsert));