ホームページ ウェブフロントエンド jsチュートリアル 各種jsのソート方法とソート方法の違いを詳しく解説

各種jsのソート方法とソート方法の違いを詳しく解説

Jan 05, 2018 pm 05:55 PM
javascript sort 方法

今日は、気まぐれに、ソートメソッドがさまざまなソートよりも優れているのかどうかを知りたいと思いました。この記事では、主に、さまざまなソートメソッドとjsに基づくソートメソッドの違いに基づいた記事を共有します(詳細な説明)。良い参考値です。皆さんのお役に立てれば幸いです。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
  <title>图片列表生成交互组件</title>
  <style>
    * {
      margin: 0;
      border: 0;
    }
    html, body {
      height: 100%;
    }
    #p {
      height: 100%;
      width: 100%;
    }
  </style>
</head>
<body>
<p id="p"></p>
<script src="myNeedExtend.js"></script>
<script>
  // ---------- 一些排序算法
  Sort = {
    // 利用sort进行排序
    systemSort:function(array){
      return array.sort(function(a, b){
        return a - b;
      });
    },
    // 冒泡排序
    bubbleSort:function(array){
      var i = 0, len = array.length,
        j, d;
      for(; i<len; i++){
        for(j=0; j<len; j++){
          if(array[i] < array[j]){
            d = array[j];
            array[j] = array[i];
            array[i] = d;
          }
        }
      }
      return array;
    },
    // 快速排序
    quickSort:function(array){
      //var array = [8,4,6,2,7,9,3,5,74,5];
      //var array =[0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
      var i = 0;
      var j = array.length - 1;
      var Sort = function(i, j){
        // 结束条件
        if(i == j ){ return };
        var key = array[i];
        var tempi = i; // 记录开始位置
        var tempj = j; // 记录结束位置
        while(j > i){
          // j <<-------------- 向前查找
          if(array[j] >= key){
            j--;
          }else{
            array[i] = array[j]
            //i++ ------------>>向后查找
            while(j > ++i){
              if(array[i] > key){
                array[j] = array[i];
                break;
              }
            }
          }
        }
        // 如果第一个取出的 key 是最小的数
        if(tempi == i){
          Sort(++i, tempj);
          return ;
        }
        // 最后一个空位留给 key
        array[i] = key;
        // 递归
        Sort(tempi, i);
        Sort(j, tempj);
      }
      Sort(i, j);
      return array;
    },
    // 插入排序
    insertSort:function(array){
      // http://baike.baidu.com/image/d57e99942da24e5dd21b7080
      // http://baike.baidu.com/view/396887.htm
      // var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
      var i = 1, j, temp, key, len = array.length;
      for(; i < len; i++){
        temp = j = i;
        key = array[j];
        while(--j > -1){
          if(array[j] > key){
            array[j+1] = array[j];
          }else{
            break;
          }
        }
        array[j+1] = key;
      }
      return array;
    },
    // 希尔排序
    shellSort:function(array){
      // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
      // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
      // var tempArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];
      // reverse() 在维基上看到这个最优的步长 较小数组
      var tempArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1];
      //针对大数组的步长选择
      var i = 0;
      var tempArrLength = tempArr.length;
      var len = array.length;
      var len2 = parseInt(len/2);
      for(;i < tempArrLength; i++){
        if(tempArr[i] > len2){
          continue;
        }
        tempSort(tempArr[i]);
      }
      // 排序一个步长
      function tempSort(temp){
        //console.log(temp) 使用的步长统计
        var i = 0, j = 0, f, tem, key;
        var tempLen = len%temp > 0 ? parseInt(len/temp) + 1 : len/temp;
        for(;i < temp; i++){// 依次循环列
          for(j=1;/*j < tempLen && */temp * j + i < len; j++){
            //依次循环每列的每行
            tem = f = temp * j + i;
            key = array[f];
            while((tem-=temp) >= 0){
              // 依次向上查找
              if(array[tem] > key){
                array[tem+temp] = array[tem];
              }else{
                break;
              }
            }
            array[tem + temp ] = key;
          }
        }
      }
      return array;
    }
  };
  testArrs = [];
  for (var i = 10000000; i > 0; i--) {
    testArrs.push(i);
  }
  function test(fun,arr) {
    console.log(arr);
    var oldTime = +new Date();
    var new_arr = Sort[fun](arr);
    var newTime = +new Date();
    console.log(new_arr);
    console.log(newTime-oldTime);
  }
  /*
  * sort排序 systemSort
  * 冒泡排序 bubbleSort
  * 快速排序 quickSort
  * 插入排序 insertSort
  * 希尔排序 shellSort
  *
  * */
  test("systemSort",testArrs);
</script>
</body>
</html>
ログイン後にコピー

上記の方法はテスト時間を通過し、どの並べ替え方法が時間を節約するかを分析します。正しい方法を使用すると、特にビッグデータを実行している場合に時間を大幅に節約できます。

まず長さ 10,000 の配列の処理にかかる時間を見てみましょう:

* sort sort systemSort 11
* bubble sort bubbleSort 169
* クイックソート QuickSort 144
* 挿入ソート insertSort 139
* ヒルソートシェルソート 3

100,000 個の長さの配列データをテストします:

* ソート ソート systemSort 63
* バブル ソート bubbleSort 16268
* クイック ソート QuickSort はエラーを直接報告します
* 挿入ソート insertSort 13026
* ヒル ソート shellSort 8

配列の長さ 100 万をテストします:

* ソート ソート systemSort 575
* バブル ソート bubbleSort 時間不明
* クイック ソート QuickSort はエラーを直接報告します
* 挿入ソート insertSort は直接クラッシュします
* ヒル ソート shellSort 93

1,000 万長の配列をテストします:

* sortソートシステムソート 7039
* バブルソートバブルソートはテストされていません
* クイックソートクイックソートはテストされていません
* 挿入ソートインサートソートはテストされていません
* ヒルソートシェルソート 1225

1 億の長い配列をテストします:

* ソートソートシステムソートが直接クラッシュしました
* バブルソートbubbleSort はテストされていません
* クイック ソート QuickSort はテストされていません
* 挿入ソート insertSort はテストされていません
* ヒル ソート シェルソート 19864

最悪の場合でも、ヒル ソートは依然として最高であることが判明しました。これは本当に驚くべきことです。このようにすると、どのような状況でどのようなメソッドを使用する必要があるのか​​がわかります。次に、ランダムな条件でテストします。

長さの配列を 1,000 個テストします。ソートシステムソート 8842

* バブルソート バブルソートはテストされていません

* クイックソート クイックソートはテストされていません

* 挿入ソート インサートソート 45

* ヒルソートシェルソート 1133

は未知の状況では優れており、より優れています この場合、挿入ソートが最も効率的です

関連するおすすめ:

PHPの配列ソート方法の概要

JavaScriptアルゴリズムでのソート方法の使用の詳細な説明

PHPの配列関数の紹介と配列のソート方法の概要

以上が各種jsのソート方法とソート方法の違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

トマト無料小説アプリで小説を書く方法. トマトノベルで小説を書く方法に関するチュートリアルを共有します。 トマト無料小説アプリで小説を書く方法. トマトノベルで小説を書く方法に関するチュートリアルを共有します。 Mar 28, 2024 pm 12:50 PM

トマト無料小説アプリで小説を書く方法. トマトノベルで小説を書く方法に関するチュートリアルを共有します。

WeChatの友達を削除するにはどうすればよいですか? WeChatの友達を削除する方法 WeChatの友達を削除するにはどうすればよいですか? WeChatの友達を削除する方法 Mar 04, 2024 am 11:10 AM

WeChatの友達を削除するにはどうすればよいですか? WeChatの友達を削除する方法

Colorful マザーボードに BIOS を入力するにはどうすればよいですか? 2つの方法を教えます Colorful マザーボードに BIOS を入力するにはどうすればよいですか? 2つの方法を教えます Mar 13, 2024 pm 06:01 PM

Colorful マザーボードに BIOS を入力するにはどうすればよいですか? 2つの方法を教えます

WeChat で削除された連絡先を回復する方法 (簡単なチュートリアルでは、削除された連絡先を回復する方法について説明します) WeChat で削除された連絡先を回復する方法 (簡単なチュートリアルでは、削除された連絡先を回復する方法について説明します) May 01, 2024 pm 12:01 PM

WeChat で削除された連絡先を回復する方法 (簡単なチュートリアルでは、削除された連絡先を回復する方法について説明します)

Win11で管理者権限を取得する方法まとめ Win11で管理者権限を取得する方法まとめ Mar 09, 2024 am 08:45 AM

Win11で管理者権限を取得する方法まとめ

すぐにマスター: Huawei 携帯電話で 2 つの WeChat アカウントを開く方法が明らかに! すぐにマスター: Huawei 携帯電話で 2 つの WeChat アカウントを開く方法が明らかに! Mar 23, 2024 am 10:42 AM

すぐにマスター: Huawei 携帯電話で 2 つの WeChat アカウントを開く方法が明らかに!

モバイルドラゴンの卵を孵化させる秘密が明らかに(モバイルドラゴンの卵をうまく孵化させる方法を段階的に教えます) モバイルドラゴンの卵を孵化させる秘密が明らかに(モバイルドラゴンの卵をうまく孵化させる方法を段階的に教えます) May 04, 2024 pm 06:01 PM

モバイルドラゴンの卵を孵化させる秘密が明らかに(モバイルドラゴンの卵をうまく孵化させる方法を段階的に教えます)

Oracleバージョンの問い合わせ方法の詳細説明 Oracleバージョンの問い合わせ方法の詳細説明 Mar 07, 2024 pm 09:21 PM

Oracleバージョンの問い合わせ方法の詳細説明

See all articles