js排序算法

157 阅读3分钟

一、冒泡排序

1、两层循环嵌套

2、小则往上浮

记忆特点:双层循环、组内比较

var arr = [1,21,44,3,12,5,54,6,12,5,6,7];
var len = arr.length;

//外层循环控制循环的次数
for(var i = 0; i < len; i++){
//内层循环进行元素的比较,因为轮到最后一个需要排序的元素时已经排序好了,所以可以-1,不需要进行
    for(var j = 0; j < len - i - 1; j++){
         if(arr[j] > arr[j + 1]){
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            //或者使用解构[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
         }
    }
}

console.log(arr)

二、选择排序

1、两层循环嵌套。

2、假定第一次循环的第一个数 i 是最小的值,保存其下标。

3、然后循环 i 后面的所有数和 i 比较,如果有更小的则保存其下标。

4、在第一趟循环即将结束时将 arr[i] 的值 替换为 arr[minIndex]。

记忆特点:一层循环最小值,二层循环换最小值,最后使用最小值(选择最小值)

var arr = [1,21,44,3,11,5,54,61,12,51,6,7];
var len = arr.length;

for(var i = 0; i < len; i++){
    //假定第一趟下标为最小值
    var minIndex = i;
    //从假定值的后一个开始循环
    for(var j = i + 1; j < len; j++){
        if(arr[j] < arr[minIndex]){
            minIndex = j;
        }
    }
    [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}

console.log(arr)

三、插入排序

1、两层循环嵌套。

2、外层循环遍历每个元素。

3、内层循环将每次循环到的数和之前排序好的数进行比较。

记忆特点:比较排序好的(插入排序好的)

var arr = [1,21,44,3,11,5,54,61,12,51,6,7];
var len = arr.length;

//假设数组中第一个数已经排序好了,所以从 1 开始循环。
for(var i = 1; i < len; i++){
    for(var j = i; j > 0; j --){
        //如果当前循环到的比之前排序好的最大值都大,则不用继续此趟比较
        if(arr[j] >= arr[j - 1]){
            break;
        }else{
            [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
        }
    }
}

console.log(arr)

四、快速排序

1、一层循环,需要递归。

2、以每次递归的第一个数组元素为基准数。

3、比基准数小放入left数组,比基准数大放入right数组。

4、如果小于等于1一个元素则不用进行下一次递归。

5、依次连接 左数组、基准数、右数组。

6、下图是浏览器中打印以下log的结果

console.log(left, ponit, right)

记忆特点:设置标记值,放入左右数组,递归(一层循环)

控制台递归log顺序

function quickSort(arr){
    //递归出口
    if(arr.length <= 1){
         return arr;
    }

    var left = [];
    var right = [];
    var point = arr[0];
    //第一个数组元素被设定为标记点,所以可以从下一个元素开始循环
    for(var i = 1; i < arr.length; i++){
        if(arr[i] < point){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    //进行更深层的比较
    return quickSort(left).concat(point, quickSort(right));
}

quickSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

五、感谢及参考

前端面试查漏补缺--(十四)算法及排序