[概要]:Dachangのインタビューでは、ハンドティアコードをテストすることがよくあります-JavaScriptソートアルゴリズム(バブルソート、選択ソート、挿入ソート、クイックソート)


1.バブルソート

アバティ

 //冒泡排序
    let arr = [2, 4, 1, 6, 3]
    function bubbled(arr) {
    
    
        for (let i = 0; i < arr.length - 1; i++) {
    
    
            //【!!注意】这里不是j=i,因为回回都必须重头遍历,才能不漏一个嘛~
            for (let j = 0; j < arr.length - 1; j++) {
    
    
                if (arr[j] > arr[j + 1]) {
    
    
                    let temp
                    temp = arr[j]
                    arr[j] = arr[j + 1]
                    arr[j + 1] = temp
                }
            }
        }
        return arr
    }
    console.log(bubbled(arr));  //[1,2,3,4,6]

2.選択ソート

アバティ

//选择排序(指挨个挨个遍历,`选择`右侧最小与之交换)
    let arr1 = [2, 4, 1, 6, 3]
    function select(arr1) {
    
    
        for (let i = 0; i < arr1.length - 1; i++) {
    
    
            let min = i    //保存右侧最小值的下标
            for (let j = i + 1; j < arr1.length; j++) {
    
    
                if (arr1[j] < arr1[min]) {
    
    
                    //【!!注意】:这里每次循环保存相对较小值的下标
                    min = j
                }
            }
            if (arr1[min] < arr1[i]) {
    
    
                let temp;
                temp = arr1[min]
                arr1[min] = arr1[i]
                arr1[i] = temp
            }
        }
        return arr1
    }
    console.log(select(arr1));  //[1,2,3,4,6]

3.挿入ソート

アバティ


    //插入排序
    let arr2 = [2, 4, 1, 6, 3]
    function Ins(arr2) {
    
    
        let temp  //专门用于保存作为比较的i项
        for (let i = 1; i < arr2.length; i++) {
    
    
            while (i > 0 && arr2[i] < arr2[i - 1]) {
    
    
                temp = arr2[i]     //先对后面的值保存一下,因为这个值还要跟前面做对比啊! 你看下一步就要把后面的值覆盖了
                arr2[i] = arr2[i - 1]

                arr2[i - 1] = temp
                i--;
            }
        }
        return arr2
    }
    console.log(Ins(arr2))  //[1,2,3,4,6]

4.クイックソート

クイックソートアルゴリズムの基本的な考え方は次のとおりです:


  • 配列から数値を取得し、それをピボットと呼びます

  • 配列を反復処理し、ベースよりも大きい数値を右側に、ベースよりも小さい数値を左側に配置します。トラバーサルが完了すると、配列は左と右の2つの領域に分割されます。

  • 左右の領域を2つの配列として扱い、並べ替えが完了するまで最初の2つの手順を繰り返します。

アバティ

let arr3 = [2, 4, 1, 6, 3]
    function fast(arr3) {
    
    
        if (arr3.length <= 1) return arr3; //【!!!注意】:这一句必须加上,因为有时候递归回来可能左边数组只有一个元素(或空数组),这时直接返回arr ,结束left递归,让它去递归right

        let left = [];
        let right = [];
        let pivot = arr3[0]
        for (let i = 1; i < arr3.length; i++) {
    
    
            if (arr3[i] < pivot) {
    
    
                left.push(arr3[i])
            } else {
    
    
                right.push(arr3[i])
            }
        }
        return fast(left).concat([pivot], fast(right))
    }
    console.log(fast(arr3));   //[1,2,3,4,6]

おすすめ

転載: blog.csdn.net/weixin_60297362/article/details/123080039