ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript でのいくつかのソート アルゴリズムの簡単な実装_基礎知識

JavaScript でのいくつかのソート アルゴリズムの簡単な実装_基礎知識

WBOY
WBOYオリジナル
2016-05-16 15:48:241156ブラウズ

ソートアルゴリズムの実装

私の JS スキルは低いので、JAVA と C に似た方法を使用して JavaScript のソート アルゴリズムを作成します。

ここではアルゴリズムの原則については説明しません。コードの実装についてのみ説明します。バグがある可能性があります。ガイダンスとしてブログにコメントしてください。
挿入ソート

Insertion-Sort のアルゴリズムの説明は、シンプルで直感的な並べ替えアルゴリズムです。ソートされていないデータの場合は、ソートされたシーケンスを後ろから前にスキャンし、対応する位置を見つけて挿入します。挿入ソートの実装では、通常、インプレース ソート (つまり、O(1) 個の余分なスペースのみを使用するソート) が使用されます。そのため、後ろから前へのスキャン プロセス中に、繰り返し、徐々にシフトする必要があります。要素を後方にソートし、最新の要素の挿入スペースを提供します。

実装コードは次のとおりです:

function insertSort(arr) {
  if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 1, len = arr.length; i < len; i ++) {
    var stand = arr[i];
    for (var j = i - 1; j >= 0; j --) {
      if (arr[j] > stand) {
        arr[j + 1] = arr[j];
      } else {
        arr[j + 1] = stand;
        break;
      }
    }
  }

  return arr;
}

時間計算量は O(n^2)

もちろん、検索と置換の位置アルゴリズムを二分探索に変更するなど、このアルゴリズムを最適化する余地はあります。
バブルソート

古典的なソートアルゴリズム、バブルソートとなると心が痛む。私は学部時代にバブルソートアルゴリズムの改良に関する必須論文を書きましたが、その結果、論文を書き終えた後、バブルソートアルゴリズムを完全に実装することができませんでした。

  if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 0; i < len; i ++) {
    for (var j = 0; j < len - i - 1; j ++) {
      if (arr[j] > arr[j + 1]) {
        var tmp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = tmp;
      }
    }
  }

  return arr;
}


時間計算量は次のとおりです: O(n^2)
クイックソート

非常に古典的な並べ替えアルゴリズム。並べ替えプロセスは主に 3 つのステップに分かれています。

  1. シーケンスから「ピボット」と呼ばれる要素を選択します。
  2. ベースライン値より小さいすべての要素がベースラインの前に配置され、ベースライン値より大きいすべての要素がベースラインの後ろに配置されるようにシーケンスを並べ替えます (同じ番号をどちらの側にも配置できます)。このパーティションが終了すると、塩基はシーケンスの途中になります。これはパーティション操作と呼ばれます。
  3. 基本値より小さい要素の部分配列と基本値より大きい要素の部分配列を再帰的に並べ替えます。

実装コードは次のとおりです:

function quickSort(arr, bt, ed) {
  if (bt < ed) {
    var pivot = findPartition(arr, bt, ed);
    quickSort(arr, bt, pivot - 1);
    quickSort(arr, pivot + 1, ed);
  }
}

function findPartition(arr, bt, ed) {
  var stand = arr[bt];

  while (bt < ed) {
    while (bt < ed && arr[ed] >= stand) {
      ed --;
    }
    if (bt < ed) {
      arr[bt ++] = arr[ed];
    }
    while (bt < ed && arr[bt] <= stand) {
      bt ++;
    }
    if (bt < ed) {
      arr[ed --] = arr[bt]; 
    }
  }

  arr[bt] = stand;
  return bt;
}


時間計算量は O(nlogn) です。
並べ替えを結合

これは非常に古典的な並べ替えアルゴリズムでもあり、js を学ぶ機会を利用して古典的な並べ替えアルゴリズムを復習しました。マージ ソートのアイデアについては、私のブログ「マージ ソート」を参照してください。ここではjsの実装のみを書きます。

function mergeSort(arr, bt, ed) {
  if (bt < ed) {
    var mid = bt + parseInt((ed - bt) / 2);
    mergeSort(arr, bt, mid);
    mergeSort(arr, mid + 1, ed);
    mergeArray(arr, bt, mid, ed);    
  }
}

function mergeArray(arr, bt, mid, ed) {
  var mArr = [];
  var i = bt, j = mid + 1;
  while (i <= mid && j <= ed) {
    if (arr[i] <= arr[j]) {
      mArr.push(arr[i++]);
    } else {
      mArr.push(arr[j ++]);
    }
  }

  if (i <= mid) {
    mArr = mArr.concat(arr.slice(i, mid + 1));
  }

  if (j <= ed) {
    mArr = mArr.concat(arr.slice(j, ed + 1));
  }

  for (var h = 0; h < mArr.length; h ++) {
    arr[bt + h] = mArr[h];
  }
}


マージ ソートを作成するときに、もう 1 つの小さなエピソードがありました。js は自動的に切り上げることができなかったので、後で parseInt メソッドを使用しました。これは非常に魅力的でした。


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