blog

データ構造とアルゴリズム - 並べ替えと検索のアルゴリズム

ソート:乱れた配列を昇順または降順の配列にすること。ソートアルゴリズムは、バブルソート、選択ソート、挿入ソート、サブサンプションソート、クイックソート... 検索: 配列内の要素の添え字を検索します。...

Apr 20, 2020 · 4 min. read
シェア

簡単

ソート:乱れた配列を昇順または降順に並べ替えること。ソートのアルゴリズムには、バブルソート、選択ソート、挿入ソート、サブサンプションソート、クイックソートなどがあります。

検索 : 配列内の要素の添え字を検索します。配列の indexOf メソッド。検索アルゴリズムには、逐次検索、バイナリ検索...

ソート1:バブルソート

/**
 * 時間の複雑さはO(n^2)
 * 空間の複雑さはO(1)
 * 
 * 1最初のラウンドでは、現在の要素と次の要素が比較され、1ラウンド後に最大値が最後の場所に移動する。
 * 2 n-1 
 */
Array.prototype.bubbleSort = function () {
 for(let i = 0; i < this.length-1; i++){// n-1 
 for (let j = 0; j < this.length - 1 -i; j++) { //各歩行の後、k番目に大きいものを最後に押す
 if (this[j] > this[j + 1]) {
 const temp = this[j];
 this[j] = this[j + 1];
 this[j + 1] = temp;
 }
 }
 }
}
var arr = [5,4,3,2,1];
arr.bubbleSort();

ソート2:セレクションソート

/**
 * 時間の複雑さはO(n^2)
 * 空間の複雑さはO(1)
 * 
 * 1最初のラウンドでは、現在の最小値と現在の値を比較し、最小値の位置を見つける。
 * 2 n-1 
 */
Array.prototype.selectionSort = function(){
 for(let i = 0; i < this.length; i++){ // n-1 
 let indexMin = i;
 for (let j = i; j < this.length; j++) { //最初のラウンドで最小値を見つけ、それを1位にする
 if (this[indexMin] > this[j]) {
 indexMin = j;
 }
 }
 if (indexMin != i){
 const temp = this[i];
 this[i] = this[indexMin];
 this[indexMin] = temp;
 }
 }
}
const arr = [5, 4, 3, 2, 1];
arr.selectionSort();

ソート3:挿入ソート

/**
 * 時間の複雑さはO(n^2)
 * 空間の複雑さはO(1)
 * 
 * 12番目の要素から始めて、その前の番号と比較する。その前に並べなければならない
 * 2 n-1 
 */
Array.prototype.insertionSort = function(){
 for(let i = 1; i < this.length; i++){
 for (let j = i; j > 0; j--) {//正しい場所を見つけるために前進する
 if (this[j] < this[j - 1]) {
 const temp = this[j];
 this[j] = this[j-1];
 this[j-1] = temp;
 } else {
 break;
 }
 }
 }
}
let arr =[5, 3, 4, 2, 1];
arr.insertionSort();

ソート4:サブサンプション

/**
 * 
 * 時間の複雑さの合計はO(n*logn)
 * 1二分法:配列を2つに分割し、個々の数値に分割されるまで再帰的に部分配列を「分割」する。時間の複雑さはO(logn)
 * 2マージ:2つの数値を順序付き配列にマージし、すべての部分配列が完全な配列にマージされるまで、順序付き配列をマージする。時間の複雑さはO(n)
 * 
 * アルゴリズムのステップ
 * 1最終的にソートされた配列を格納するために、新しい配列resを作成する。
 * 22つの順序付き配列の先頭を比較し、小さい方をキューから取り出し、resにプッシュする。
 * 3配列にまだ値がある場合は、ステップ2を繰り返す
 */
Array.prototype.mergeSort = function () {
 
 const rec = function (arr) {
 if(arr.length == 1){
 return arr;
 }
 let mid = Math.floor(arr.length / 2);
 let left = arr.slice(0, mid);
 let right = arr.slice(mid, arr.length);
 let orderLeft = rec(left);
 let orderRight = rec(right);
 let res = [];
 while (orderLeft.length || orderRight.length) {
 if (orderLeft.length && orderRight.length){
 res.push(orderLeft[0] > orderRight[0] ? orderRight.shift() : orderLeft.shift());
 } else if (orderLeft.length){
 res.push(orderLeft.shift())
 } else {
 res.push(orderRight.shift())
 }
 }
 return res;
 }
 const res = rec(this);
 return res.forEach((n, i) => {
 this[i] = n;
 });
 
}
let arr = [5,4,3,2,1];
arr.mergeSort();

ソート5:クイックソート

/**
 * 再帰的な時間の複雑さはO(logn)
 * パーティショニング操作の時間複雑度はO(n)
 * 時間の複雑さの合計はn(n*logn)
 * 
 * アルゴリズムのステップ
 * パーティショニング:配列から任意のデータムを選択し、データムより小さい要素はすべてデータムの前に、データムより大きい要素はすべてデータムの後ろに配置する。
 * 再帰:ベンチマーク前後のサブ配列の再帰的分割
 * 
 */
Array.prototype.quickSort = function(){
 const rec = function(arr){
 if(arr.length <= 1){
 return arr;
 }
 let left = [];
 let right = [];
 let mid = arr[0];
 for(let i = 1; i < arr.length; i++){
 if(arr[i] < mid){
 left.push(arr[i])
 } else {
 right.push(arr[i]);
 }
 }
 return [...rec(left), mid, ...rec(right)];
 }
 const res = rec(this);
 res.forEach((n, i) => {
 this[i] = n;
 });
}
let arr = [5,4,3,2,1];
arr.quickSort();

検索1:逐次検索

/**
 * 逐次検索
 * 時間の複雑さはO(n)
 */
Array.prototype.sequentialSearch = function(target){
 for (let i = 0; i < this.length; i++) {
 if (this[i] === target){
 return i;
 }
 }
 return -1;
}
const res = [1,2,3,4,5].sequentialSearch(6);
console.log(res);

検索2:二分法検索

/**
 * 時間の複雑さはO(logn)
 * 前提条件配列は順序配列である
 * 
 * アルゴリズムのアイデア
 * 1配列の真ん中の要素から検索を開始し、真ん中の要素がちょうどターゲット値であれば、検索は終了する。
 * 2ターゲット値が真ん中の要素より大きいか小さい場合、真ん中の要素より大きいか小さい配列の半分を検索する。
 */
 Array.prototype.binarySearch = function (target) {
 
 let low = 0;
 let high = this.length -1;
 while (low <= high) {
 let mid = Math.floor((low + high) / 2);
 if (this[mid] > target){
 high = mid - 1;
 } else if (this[mid] < target){
 low = mid + 1;
 } else {
 return mid;
 }
 }
 return -1;
 }
const res = [1, 2, 3, 4, 5].binarySearch(6);
console.log(res);

知識ソース:coding.imooc.com/learn/list/...

Read next