C++でソートされていない配列からK番目に小さい・大きい要素を求める方法
このチュートリアルでは、ソートされていない配列の中からk番目に小さい数値、およびk番目に大きい数値を見つけるプログラムをC++で作成する方法を解説します。
アルゴリズムの手順
問題を解くための基本的な流れは以下の通りです。
- 配列とkの値を初期化します。
sort関数を使って配列を昇順にソートします。- インデックス
k - 1の要素を返します。
サンプルコード:k番目に小さい要素
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int findKthSmallestNumber(int arr[], int n, int k) {
sort(arr, arr + n);
return arr[k - 1];
}
int main() {
int arr[] = { 45, 32, 22, 23, 12 }, n = 5, k = 3;
cout << findKthSmallestNumber(arr, n, k) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
23
配列を昇順にソートすると { 12, 22, 23, 32, 45 } となるため、3番目に小さい要素は 23 です。
k番目に大きい要素を求めるには
k番目に大きい要素が必要な場合は、昇順ソート後のインデックス n - k の要素を取得すればOKです。
#include <bits/stdc++.h>
using namespace std;
int findKthLargestNumber(int arr[], int n, int k) {
sort(arr, arr + n);
return arr[n - k];
}
int main() {
int arr[] = { 45, 32, 22, 23, 12 }, n = 5, k = 3;
cout << findKthLargestNumber(arr, n, k) << endl;
return 0;
}
降順に並べると { 45, 32, 23, 22, 12 } なので、3番目に大きい要素も 23 となります。
計算量とより効率的な方法
sort を使う場合の時間計算量は O(n log n) です。もし部分ソートで十分な場合は、標準ライブラリの std::nth_element を使うと、平均 O(n) でk番目の要素を求められます。
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = { 45, 32, 22, 23, 12 }, n = 5, k = 3;
nth_element(arr, arr + k - 1, arr + n);
cout << arr[k - 1] << endl;
return 0;
}
nth_element は、指定した位置(ここでは arr + k - 1)に「その位置にあるべき要素」を配置してくれる便利な関数です。配列全体を完全にソートする必要がないため、高速に動作します。
まとめ
本記事では、C++でソートされていない配列からk番目に小さい・大きい要素を求める方法を紹介しました。シンプルなのは sort を使う方法、パフォーマンスを重視するなら nth_element を使う方法がおすすめです。チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
配列の分割(パーティション)手法でk番目に小さい要素を見つけるC++プログラム
本記事では、配列を分割(パーティション)する手法を用いて、配列内のk番目に小さい要素を求めるC++プログラムを解説します。この手法はクイックソートの考え方を応用したもので、配列全体をソートすることなく、目的の要素だけを効率的に特定できる点が特徴です。 アルゴリズム まず、ピボットを基準に配列を分割する CreatePartition() 関数と、その結果をもとにk番目に小さい要素が存在する範囲を再帰的に絞り込む Partition() 関数を使用します。 Begin 関数 CreatePartition() は 配列 a、下限 l、上限 h を引数にとる in := l、pi
-
C++で配列の最大要素とその位置を見つける方法
配列の最大要素とは配列には複数の要素が格納されており、その中で他のすべての要素よりも大きい値を持つものが「最大要素」です。具体例51724上記の配列の場合、最大要素は7であり、インデックス2の位置に存在します。それでは、配列の最大要素を求めるC++プログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() { int a[] = {4, 9, 1, 3, 8}; int largest, i, pos; largest = a[0]; for(i=1; i<