C++でソート済み配列を最大・最小交互の形式に並べ替える方法
問題の概要
ソート済みの配列が与えられます。この配列を「最大・最小形式」に並べ替えることが求められます。具体的には、1番目の要素が最大値、2番目の要素が最小値、3番目の要素が2番目に大きい値、4番目の要素が2番目に小さい値、というように交互に配置していきます。以下に例を示します。
入力 : arr[ ] = { 10, 20, 30, 40, 50, 60 }
出力 : { 60, 10, 50, 20, 40, 30 }
説明 : 配列は「1番目の最大値、1番目の最小値、2番目の最大値、2番目の最小値、3番目の最大値、3番目の最小値」という順序で並べ替えられます。
入力 : arr[ ] = { 15, 17, 19, 23, 36, 67, 69 }
出力 : { 69, 15, 67, 17, 36, 19, 23 }
配列を最大・最小形式に並べ替えるには、次のアプローチが有効です。
解決策のアプローチ
ツーポインタ(双方向ポインタ)アプローチ
まず、最大要素と最小要素を指すための変数 min と max を用意し、並べ替えた結果を格納するために同じサイズの新しい空の配列を作成します。次に配列を走査し、現在のインデックスが偶数の場合は arr[max] の要素を新しい配列に追加して max を1減らします。インデックスが奇数の場合は arr[min] の要素を追加して min を1増やします。この処理を max が min より小さくなるまで繰り返します。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
int main () {
int arr[] = { 1, 2, 3, 4, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
// 並べ替えた配列を格納するための新しい配列を作成
int final[n];
// 変数を先頭と末尾の要素のインデックスに設定
int min = 0, max = n - 1;
int count = 0;
// max が min 以上である間、配列を反復処理する
for (int i = 0; min <= max; i++) {
// count が偶数の場合は最大側の要素を格納
if (count % 2 == 0) {
final[i] = arr[max];
max--;
}
// 奇数の場合は最小側の要素を格納
else {
final[i] = arr[min];
min++;
}
count++;
}
// 最終的な並べ替え後の配列を出力
for (int i = 0; i < n; i++)
cout << final[ i ] << " ";
return 0;
}
出力結果
6 1 5 2 4 3
コードの解説
- 変数は
min = 0、max = 配列長(n) - 1として初期化されます。 for (int i = 0; min <= max; i++)により、maxがminより小さくなるまで配列を反復処理します。- カウントが偶数の場合は、
maxが指す要素を最終配列に追加し、変数maxを1減らします。 - カウントが奇数の場合は、
minが指す要素を最終配列に追加し、変数minを1増やします。 - 最終的に、結果の配列は
final[ ]配列に格納されます。
まとめ
本記事では、与えられた配列を最大・最小形式に並べ替える解決策について解説しました。ツーポインタ法を用いた効率的なアプローチにより、時間計算量 O(n) でこの問題を解くことができます。また、C++による実装コードも紹介しました。同様のプログラムは、C、Java、Python など他の言語でも簡単に記述できます。この記事が皆さんのお役に立てば幸いです。
-
C++で二分探索木(BST)を使って配列の最大要素を検索する方法
本記事では、二分探索木(Binary Search Tree:BST)を利用して、配列の中から最大要素を検索するC++プログラムを紹介します。二分探索木の構造的な性質を活かすことで、最大値の探索は右側のノードを辿るだけで完了し、このプログラムの計算量は O(log n) に抑えられます。アルゴリズム開始 与えられたデータ要素をもとに二分探索木を構築する。 ルートポインタを、存在する限り最も右側の子ノードへ辿り続ける。 そのノードのデータ部分を、データ集合の最大要素として出力する。 最大データの深さ(ルートからの距離)を出力する。 終了仕組みのポイント二分探索木では、「左
-
C++で線形探索を使って配列の最小要素を求めるプログラム
本記事では、線形探索(リニアサーチ)の手法を用いて、配列内の最小要素を求めるC++プログラムを紹介します。このプログラムの計算量はO(n)です。線形探索は配列の先頭から順に要素を一つずつ確認していくシンプルなアルゴリズムであり、配列がソートされている必要がないため、どのような配列にも適用できるのが特徴です。 アルゴリズム 開始 データ要素を配列に格納する。 インデックス「0」の値を最小値変数に代入する。 最小値を他のデータ要素と順番に比較する。 最小値がそのインデックスの値より大きい場合は、値を更新する。 最小値を出力する。 終了 サンプルコード #includ