データ構造を学んでからさまざまなアルゴリズムの基本にさらされていますが、試験を終えてから練習したことはありません。私が開発していたとき、私はそれを使用したときにもチェックしました。今、私はJavaScriptを学んでいます。この時間をかけて、さまざまな基本アルゴリズムを整理し、それぞれJSとPHP構文でコードを書き込みます。
1。バブルソート
原則:隣接する数値をペアで比較し、小さいものから大部分または大部分に順番に交換します。旅行の後、最大または最小の数が最後の数字に交換され、最初から最後の数字までの最初から最後まで比較して交換します。
時間の複雑さ:平均ケース:O(N2)最良のケース:O(n)最悪の場合:O(N2)
宇宙の複雑さ: o(1)
安定性:安定
// JavaScript Syntax var Array = [23,0,32,45,56,75,43,0,34]; for(var i = 0; i <array.length; i ++){var issort = true; for(var j = 0; j <array.length -1 -i; j ++){if(array [j]> array [j+1]){sistort = false; var temp = array [j]; array [j] = array [j + 1];配列[j + 1] = temp; }} if(sistort){break; }} console.log(array); <?php $ array = [23,0,32,45,56,75,43,0,34]; for($ i = 0; $ i <count($ array); $ i ++){$ sistort = true; for($ j = 0; $ j <count($ array)-1; $ j ++){if($ array [$ j]> $ array [$ j+1]){$ sistort = false; $ temp = $ array [$ j]; $ array [$ j] = $ array [$ j + 1]; $ array [$ j + 1] = $ temp; }} if($ sistort){break; }} var_dump($ array);?>2。シンプルな選択ソート
原則: NIキーワードを比較することにより、n-i+1レコードの最小キーワードでレコードを選択し、i(1 <= i <= n)THレコードと交換します。シンプルな選択ソートのパフォーマンスは、バブルソートよりもわずかに優れています。
時間の複雑さ:平均ケース:O(N2)最良のケース:O(n)最悪の場合:O(N2)
宇宙の複雑さ: o(1)
安定性:不安定
// javascript var array = [23,0,32,45,56,75,43,0,34]; for(var i = 0; i <array.length -1; i ++){var pos = i; for(var j = i+1; j <array.length; j ++){if(array [j] <array [pos]){pos = j; }} var temp = array [i]; array [i] = array [pos];配列[pos] = temp; } console.log(array); <?php $ array = [23,0,32,45,56,75,43,0,34]; for($ i = 0; $ i <count($ array); $ i ++){$ pos = $ i; for($ j = $ i+1; $ j <count($ array); $ j ++){if($ array [$ j] <$ array [$ pos]){$ pos = $ j; }} $ temp = $ array [$ i]; $ array [$ i] = $ array [$ pos]; $ array [$ pos] = $ temp; } var_dump($ array);?>3。並べ替えを直接挿入します
原則:並べ替えられた順序付けテーブルにレコードを挿入し、それにより、1つのレコードを1インチの新しい注文したテーブルを取得します。つまり、最初にシーケンスの最初のレコードを順序付けされたサブシーケンスとして扱い、次にシーケンス全体が順序付けられるまで、2番目のレコードから1つずつ挿入します。バブルメソッドと選択選別よりも優れたパフォーマンス
時間の複雑さ:平均ケース:O(N2)最良のケース:O(n)最悪の場合:O(N2)
宇宙の複雑さ: o(1)
安定性:安定
// javascript var array = [23,0,32,45,56,75,43,0,34]; for(var j = 0; j <array.length; j ++){var key = array [j]; var i = j -1; while(i> -1 && array [i]> key){array [i + 1] = array [i]; i = i -1; } array [i + 1] = key; } console.log(array); <?php // sort $ array = [23,0,32,45,56,75,43,0,34]を直接挿入します。 for($ i = 0; $ i <count($ array); $ i ++){$ key = $ array [$ i]; $ j = $ i -1; while($ j> -1 && $ array [$ j]> $ key){$ array [$ j +1] = $ array [$ j]; $ j = $ j -1; } $ array [$ j + 1] = $ key; } var_dump($ array);?>4。クイックソート
原則:並べ替えを通じて、ソートされるデータは2つの独立した部分に分割され、部分的なすべてのデータは他の部分のすべてのデータよりも小さく、次にデータの2つの部分がこの方法に従って迅速にソートされます。ソートプロセス全体を再帰的に実行して、データ全体が順序付けられたシーケンスになるように達成できます。
時間の複雑さ:平均ケース:O(nlog2n)最良のケース:o(nlog2n)最悪の場合:o(n2)
スペースの複雑さ: O(nlog2n)
安定性:不安定
// JavaScript Quick Sort var Array = [23,0,32,45,56,75,43,0,34]; var QuickSort = function(arr){if(arr.length <= 1){return arr; } //配列内の要素の数を確認します。1以下の場合、返されます。 var pivotindex = math.floor(arr.length/2); // var pivot = arr.splice(pivotindex、1)[0]; // select "benchmark"(pivot)(pivot)を選択し、var left = []; // 2つの空の配列を定義して、1つの右側のサブセットと1つの右側のサブセットを格納します= []; for(var i = 0; i <arr.length; i ++)//アレイをtransweepし、左側のサブセットに「ベンチマーク」よりも小さい要素を、右側のサブセットにベンチマークよりも大きい要素を入れます。 {if(arr [i] <pivot){left.push(arr [i]); } else {right.push(arr [i]); }} quicksort(左).concat([pivot]、quicksort(右))を返します; //このプロセスを継続的に繰り返して、ソートされた配列を取得します。 }; var newArray = QuickSort(Array); console.log(newArray); <?php $ array = [23,0,32,45,56,75,43,0,34];関数Quick_Sort($ arr){//最初に$ length = count($ arr)を続行する必要があるかどうかを判断します。 if($ length <= 1){return $ arr; } $ base_num = $ arr [0]; //ルーラーを選択して最初の要素を選択します$ arr [$ i]){//左配列に入れます$ left_array [] = $ arr [$ i]; } else {//右$ right_array [] = $ arr [$ i]; }} //次に、左右の配列の同じソートメソッド//この関数を再帰的に呼び出し、結果を記録し、$ left_array = Quick_sort($ left_array); $ right_array = quick_sort($ right_array); //左の定規を右にマージしますreturn array_merge($ left_array、array($ base_num)、$ right_array); } $ newArray = Quick_Sort($ array); var_dump($ newArray);?>5。ヒルソート
原則:最初に、直接挿入とソートのために、レコードシーケンス全体をいくつかのサブシーケンスに分割します。シーケンス全体のレコードが「基本的に順序付けられている」ときは、レコード全体を並べ替えて並べ替えて並べ替えます。 。
時間の複雑さ:平均ケース:o(n√n)最良のケース:o(nlog2n)最悪の場合:o(n2)
宇宙の複雑さ: o(1)
安定性:不安定
// JavaScript Hill Sort var Array = [23,0,32,45,56,75,43,0,34]; var shellsort = function(arr){var length = arr.length; var h = 1; while(h <length/3){h = 3*h+1; // set interval} while(h> = 1){for(var i = h; i <length; i ++){for(var j = i; j> = h && arr [j] <arr [jh]; j- = h){var temp = arr [jh]; arr [jh] = arr [j]; arr [j] = temp; }} h =(h-1)/3; } return arr; } var newArray = shellsort(array); console.log(newArray); <?php // hill sort $ array = [23,0,32,45,56,75,43,0,34]; function shellsort($ arr){$ length = count($ arr); $ h = 1; while($ h <$ length/3){$ h = 3*$ h+1; // set interval} while($ h> = 1){for($ i = $ h; $ i <$ length; $ i ++){for($ j = $ i; $ j> = $ h && $ arr [$ j] <$ j- $ h]; $ j-$ h); $ arr [$ j- $ h] = $ arr [$ j]; $ arr [$ j] = $ temp; }} $ h =($ h-1)/3; } $ arrを返します。 } $ newArray = shellsort($ array); var_dump($ newArray)?>6。注文
原則:初期シーケンスにnレコードが含まれていると仮定すると、N順序付けされたサブシーケンスと見なすことができ、各サブシーケンスの長さは1で、次にペアでマージされて2または1の長さの順序付け(N/2以上)を取得し、ペアでマージされました。
時間の複雑さ:平均ケース:O(nlog2n)最良のケース:O(nlog2n)最悪の場合:o(nlog2n)
宇宙の複雑さ: o(1)
安定性:安定
// javascriptマージソート関数isarray1(arr){if(object.prototype.tostring.call(arr)== '[object array]'){return true; } else {return false; }}関数マージ(左、右){var result = []; if(!isarray1(左)){左= [左]; } if(!isarray1(右)){右= [右]; } while(left.length> 0 && right.length> 0){if(left [0] <right [0]){result.push(left.shift()); } else {result.push(right.shift()); }} return result.concat(左).concat(右); }関数mergesort(arr){var len = arr.length; var lim、work = []; var i、j、k; if(len == 1){return arr; } for(i = 0; i <len; i ++){work.push(arr [i]); } work.push([]); for(lim = len; lim> 1;){// limは(j = 0、k = 0; k <lim; j ++、k = k+2)のグループ化長です。 } work [j] = []; lim = math.floor((lim+1)/2); } return work [0]; } var array = [23,0,32,45,56,75,43,0,34]; console.log(mergesort(array)); <?php //ソート関数の理解mergesort(&$ arr){$ len = count($ arr); //配列長msort($ arr、0、$ len-1); } //実際に並べ替え関数msort(&$ arr、$ left、$ right){if($ left <$右){//サブシーケンスに1つの追加要素があることを示します。 //左側を再度並べ替える:msort($ arr、$ left、$ center); //再帰的に呼び出して、右側を再度ソートする($ arr、$ center+1、$ right); //並べ替えの結果をマージするmergearray($ arr、$ left、$ center、$ right); }} // 2つの順序付けされた数値を順序付き配列関数mergearray(&$ arr、$ left、$ center、$ right)に組み合わせます{// 2つの開始位置マーク$ a_i = $左を設定します。 $ b_i = $ center+1; while($ a_i <= $ center && $ b_i <= $ right){//配列aも配列Bが境界を通過しない場合もif($ arr [$ a_i] <$ arr [$ b_i]){$ temp [] = $ arr [$ a_i ++]; } else {$ temp [] = $ arr [$ b_i ++]; }} //配列Aのすべての要素が使い果たされるかどうかを判断します。そうでない場合は、配列cにすべての要素を挿入します。 } //配列bのすべての要素が使い果たされるかどうかを判断します。そうでない場合は、配列cにすべての要素を挿入します。 } //ソートされた部分を$ arrcの$ arr:for($ i = 0、$ len = count($ temp); $ i <$ len; $ i ++){$ arr [$ lef+$ i] = $ temp [$ i]; }} $ arr = array(23,0,32,45,56,75,43,0,34); mergesort($ arr); var_dump($ arr);?>7。ヒープソート
原則:ヒープの並べ替えは、ヒープを使用してソートする方法です。基本的なアイデアは、シーケンスを構築して大きなトップヒープに分類することです。この時点で、シーケンス全体の最大値は、ヒープの上部のルートノードです。それを削除します(実際、それはヒープアレイの端要素と交換することであり、最終要素は最大値です)、そして残りのn-1シーケンスをヒープに再構築して、n要素のサブマキシム値が取得されます。これにより、繰り返し実行され、順序付けられたシーケンスを取得できます。
時間の複雑さ:平均ケース:O(nlog2n)最良のケース:O(nlog2n)最悪の場合:o(nlog2n)
宇宙の複雑さ: o(1)
安定性:不安定
// javascript heap sort var array = [23,0,32,45,56,75,43,0,34]; function heapsort(array){for(var i = math.floor(array.length / 2); i> = 0; i-){heapadjust(array、i、array.length-1); //アレイアレイを大きな上部のヒープにビルドします} for配列[i] = array [0];配列[0] = temp; /*残りの配列は、大きな上部のヒープに組み込まれ続けています*/ heapadjust(array、0、i -1); } return array; } function heapadjust(array、start、max){var temp = array [start]; // tempは(var j = 2 * start; j <max; j * = 2)のルートノードの値です。 } if(temp> = array [j])break; array [start] = array [j]; start = j; } array [start] = temp; } var newArray = heapsort(array); console.log(newArray); <?php //ヒープソート関数heapsort(&$ arr){#initheap($ arr、0、count($ arr)-1); #Startヘッドとテールノードを交換し、一度に一方のエンドノードを削減し、($ end = count($ arr)-1; $ end> 0; $ end-){$ temp = $ arr [0]; $ arr [0] = $ arr [$ end]; $ arr [$ end] = $ temp; ajustnodes($ arr、0、$ end -1); }}##initialize Maximum Heapをinitializeし、最後の非葉のノードから開始し、最後の非葉のノードには配列長/2ラウンドダウン機能(&$ arr){$ len = count($ arr); for($ start = floor($ len / 2)-1; $ start> = 0; $ start-){ajustnodes($ arr、$ start、$ len -1); }}#調整ノード#@param $ arrayは調整される#@param $を開始します親ノードの座標を調整する#@param $ end end end end node of the end node of the aducted function ajustnodes(&$ arr、$ start、$ end){$ maxinx = $ start; $ len = $ end + 1; #調整される部品の長さ$ reftchildinx =($ start + 1) * 2-1; #Left Child Coordinate $ rightchildinx =($ start + 1) * 2; #right Child Coordinate#調整される部品に左子がある場合($ leftchildinx + 1 <= $ len){#最小ノード座標if($ arr [$ maxinx] <$ arr [$ leftchildinx]){$ maxinx = $ childinx; }#調整される部品に右の子ノードがある場合if($ rightchildinx + 1 <= $ len){if($ arr [$ maxinx] <$ arr [$ rightchildinx]){$ maxinx = $ rightchildinx; }}} #swap親ノードと最大ノードif($ start!= $ maxinx){$ temp = $ arr [$ start]; $ arr [$ start] = $ arr [$ maxinx]; $ arr [$ maxinx] = $ temp; #Exchangeが子ノードを持っている後の子ノードの場合、if(($ maxinx + 1) * 2 <= $ len){ajustnodes($ arr、$ maxinx、$ end); }}} $ arr = array(23,0,32,45,56,75,43,0,34); Heapsort($ arr); var_dump($ arr);?>8。カーディナリティソート
原則: integersを数字で異なる数値に切り取り、各数字で個別に比較します。整数は、特定の形式で文字列(名前や日付など)や浮動小数点数を表現することもできるため、RADIXソートは整数に使用されるだけではありません。
時間の複雑さ:平均ケース:O(d(r+n))最良のケース:O(d(n+rd))最悪の場合:o(d(r+n))R:キーワードのカーディナリティD:長さN:キーワードの数
スペースの複雑さ: o(rd+n)
安定性:安定
<?php #blassorting、ここでは正の整数のみがソートされます。負の数と浮動小数点数については、補完が必要です。 #counting sortを勉強することに興味があります#@param $ arrayは並べ替えられますcount($ arr); }} else {$ arr_temp = $ arr; } $ max = max($ arr); $ time_arr = array(); #storage of of of elements ocurrences#intialize occurrences array for($ i = 0; $ i <= $ max; $ i ++){$ time_arr [$ i] = 0; }#各要素の発生を($ i = 0; $ i <count($ arr_temp); $ i ++){$ time_arr [$ arr_temp); $ i ++){$ time_arr [$ arr_temp [$ i]] ++; }##($ i = 0; $ i <count($ time_arr)-1; $ i ++){$ time_arr [$ i +1] += $ time_arr [$ i]; }#sort($ i = count($ arr)-1; $ i> = 0; $ i-){$ sorted_arr [$ arr_temp [$ i]] -1] = $ arr [$ i]; $ time_arr [$ arr_temp [$ i]] - ; } $ arr = $ sorted_arr; ksort($ arr); #ignore今回のキーソートの効率損失while($ number> = pow(10、$ i)){$ i ++; } return $ i; }#単一数字からのi番目の数字の数をget_specific_digit($ num、$ i){if($ num <pow(10、$ i -1)){return 0; } return floor($ num%pow(10、$ i) / pow(10、$ i -1)); } #BLACK SORTING、サブソーティングプロセス機能として並べ替えることはRADIX_SORT(&$ arr){#first配列$ max = max($ arr)で最大の数字を見つけます。 $ max_digit = get_digit($ max); for($ i = 1; $ i <= $ max_digit; $ i ++){counting_sort($ arr、$ i); }} $ arr = array(23,0,32,45,56,75,43,0,34); radix_sort($ arr); var_dump($ arr);?>上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。