JavaScriptの一般的なソートアルゴリズムのアイデアやコードの実装

バブルソート

比較および隣接する要素の交換により、各パスサイクルは、ソートされた配列の最大値または最小値を見つけることができないようになっています。
ベスト:O(n)のみオーダーの1バブル配列を必要としています。
最悪:O(n²)
平均:O(n²)

* シングルバブル

  function bubbleSort(nums) {
        for (let i=0 , len=nums.length; i<len-1; i++) {
          //如果一轮比较中没有需要交换的数据,则说明数组已经有序,主要是为了对[5,1,2,3,4]之类的数组进行优化。
            let mark = true;
            for (let j = 0; j < len-i-1; i++) {
                if (nums[j] > nums[j+1]) {
                    [nums[j],nums[j+1]] = [nums[j+1],nums[j]]
                    mark = false
                }
            }
            if (mark) return nums
        }
    }

双方向バブル

トリップにおける通常バブルソートループのみ最大値または最小値を見つけるために、双方向バブルは、複数のサイクルは、また、最小値を見つけることができる最大値を見つけることです

     function bubbleSort_twoWays(nums) {
            let low = 0
            let high = nums.length - 1
            while(low < high) {
                let mark = true
                // 找到最大值放到到右边
                for (let i=low; i<high; i++) {
                    if(nums[i] > nums[i+1]) {
                        [nums[i],nums[i+1]] = [nums[i+1],nums[i]]
                        mark = false
                    }
                }
                high--
                // 找到最小值放到左边
                for(let j=high;j>low;j--) {
                    if(nums[j] < nums[j-1]) {
                        [nums[j],nums[j-1]] = [nums[j-1],nums[j]]
                        mark = false
                    }
                }
                low++
                if(mark) return nums
            }
        }

選択ソート

バブルソートは、ソートは要素とその後で比較および交換要素のそれぞれが選択されていることを除いて、同様です。

好ましい:O(n²)
最悪:O(n²)
平均:O(n²)

 function selectSort(nums) {
            for (let i = 0, len = nums.length; i < len; i++) {
                for (let j = i + 1; j < len; j++) {
                    if (nums[i] > nums[j]) {
                        [nums[i], nums[j]] = [nums[j], nums[i]]
                    }
                }
            }
            return nums
        }

挿入ソート
順序配列として最初の要素に、後続の要素によって、アレイ内の適切な位置が規則的に挿入されている見つけます。

最高: O(n)元の配列はすでに昇順です。
最悪: O(n²)
平均:O(n²)

function insertSort(nums) {
            for (let i = 1,len = nums.length;i < len; i++) {
                let temp = nums[i]
                let j = i
                while (j >= 0 && temp < nums[j-1]) {
                    nums[j] = nums[j-1]
                    j--
                }
                nums[j] = temp
            }
            return nums
        }

クイックソート

塩基(通常は最初の要素)、ベース要素は、その右(22分に相当)に基本要素よりも大きい、それに左よりも小さいような要素を選択し、左右の両側に再帰的に塩基配列を続けます。

好ましい:O(N * LOGN)は、均一ベースの両側に分布する全ての数字は、この時定数は、再帰的なバイナリシーケンスについてです。
最悪:O(n²)は、すべての数字は、ベースの一方の側に配置され、この時系列は、約分割挿入ソートのと等価です。
平均:O(N * LOGN)

  • 充填穴のクイックソート

右の時間から途中まで前進した後、塩基未満の(最初はベースの位置である)左に割り当てられる数は、等元の値を保持する権利が値を入力するために残され遭遇

ソートカウント

配列要素は、値の発生数が一時配列に堆積され、キーであり、最終的に元の配列に戻すための一時的なアレイを横切ります。配列はJavaScriptで保存された標準文字列であるので、配置が負のソートをカウントするために使用することができますが、小数点を整列されていないので。

好ましい:O(N + k)は、 kが最大値と最小値との差です。
最悪:O(N + K)
平均:O(N + K)

 function countingSort(nums) {
            let arr = []
            let max = Math.max(...nums)
            let min = Math.min(...nums)
            // 装桶
            for (let i=0, len=nums.length; i<len; i++) {
                let temp = nums[i]
                arr[temp] = arr[temp] + 1 || 1
            }
            let index = 0
            //还原数组
            for (let i=min; i<=max; i++) {
                while(arr[i]>0) {
                    nums[index++] = i
                    arr[i]--
                }
            }
            return nums
        }

シェルソート

いくつかの増加によってGAPは、配列全体をグループに分け、そしてバックの切り替えグループのメンバーを比較し、その後徐々に1つのインクリメントに減少されます。シーケンシングを挿入する同様のソートヒル、隙間に前進から始まるわずか数歩。

好ましい:O(N * LOGN)は2に進みます。
最悪:O(N * LOGN)
平均:O(N * LOGN)


        function shellSort(nums) {
            let len = nums.length
            // 初始步数
            let gap = parseInt(len / 2)
            // 逐渐缩小步数
            while (gap) {
                // 从第gap个元素开始遍历
                for (let i = gap; i < len; i++) {
                    //逐步和前面其他成员进行比较和交换
                    for (let j = i - gap; j >= 0; j -= gap) {
                        if (nums[j] > nums[j + gap]) {
                            [nums[j], nums[j + gap]] = [nums[j + gap], nums[j]]
                        } else {
                            break
                        }
                    }
                }
                gap = parseInt(gap / 2)
            }
            return nums
        }

オリジナルリンクします。https://mp.weixin.qq.com/s/Rl_fcWzcSQ7NkPnozIrt0A

おすすめ

転載: www.cnblogs.com/yuanchao-blog/p/10990628.html
おすすめ