C++選択ソートアルゴリズムの実現と改善(筆記試験の面接問題を含む)
2487 ワード
選択ソート(Selection sort)も最も簡単で直感的なソートアルゴリズムである.アルゴリズムステップ1)まず、ソートされていないシーケンスで最小(大)要素を見つけ、ソートされたシーケンスの開始位置2に格納します.次に、残りのソートされていない要素から最小(大)要素を探し続け、ソートされたシーケンスの最後に配置します.
3)すべての要素が並べ替えられるまで、手順2を繰り返します.
実装コード:2回の実装で、それぞれ異なるパラメータが入力され、1回の改善:毎回最大値と最小値を超えます.
選択ソートの交換操作は0~(n-1)回です.
選択ソートの比較操作はn(n−1)/2回である.
選択ソートの付与操作は0~3(n-1)回です.
比較回数O(n^2)、比較回数はキーワードの初期状態に関係なく、総比較回数N=(n-1)+(n-2)+...+1=n*(n-1)/2.
交換回数O(n)、最良の場合は、すでに秩序化され、0回交換されている.最悪の場合,逆シーケンス,n−1回交換する.
選択ソートの交換回数はバブルソートよりも少なく,交換に必要なCPU時間は比較に必要なCPU時間よりも多く,n値が小さいため,選択ソートはバブルソートよりも速い.
複雑度分析:
ベストタイム:O(n^2)
平均時間複雑度:O(n^2)
最悪時間:O(n^2)
特徴分析:In-place sort,不安定アルゴリズム(stable sort)
例題1:挿入と選択ソートで、初期データが基本順であれば挿入ソート(末尾まで)、初期データが基本逆であれば選択ソート
例題2:下記のいくつかの並べ替え方法の中で、平均検索長(ASL)が最も小さいのはAである.ソートBを挿入する.クイックソートC.集計ソートD.ソートの選択
3)すべての要素が並べ替えられるまで、手順2を繰り返します.
実装コード:2回の実装で、それぞれ異なるパラメータが入力され、1回の改善:毎回最大値と最小値を超えます.
/***************************************************************************
* @file main.cpp
* @author MISAYAONE
* @date 25 March 2017
* @remark 25 March 2017
* @theme Selection Sort
***************************************************************************/
#include
#include
using namespace std;
void Sort_swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
// , ,
void Selection_sort(vector::iterator begin,vector::iterator end)
{
for (auto p1 = begin; p1 != end; ++p1)
{
for (auto p2 = p1; p2 != end; ++p2)
{
if (*p1 > *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
}
}
// , ,
void Selection_sort(int a[],size_t size)
{
for (size_t i = 0; i < size/2; ++i)
{
int max_elem = size-1-i;
int min_elem = i;
for (size_t j = i+1; j < size-i; ++j)
{
if (a[j] < a[min_elem])
{
min_elem = j;
continue;//
}
if (a[j] > a[max_elem])
{
max_elem = j;
}
}
Sort_swap(a[i],a[min_elem]);
Sort_swap(a[size-1-i],a[max_elem]);
// : ,
if((i==size-i-1&&min_elem==max_elem)||(i==max_elem&&size-i-1==min_elem))
{
Sort_swap(a[i],a[min_elem]);//
}
}
}
int main(int argc, char **argv)
{
int a[10] = {2,5,6,3,1,4,8,7,9,0};
vector vec(a,a+10);
Selection_sort(vec.begin(),vec.end());
for (size_t i = 0; i < vec.size(); ++i)
{
cout<
選択ソートの交換操作は0~(n-1)回です.
選択ソートの比較操作はn(n−1)/2回である.
選択ソートの付与操作は0~3(n-1)回です.
比較回数O(n^2)、比較回数はキーワードの初期状態に関係なく、総比較回数N=(n-1)+(n-2)+...+1=n*(n-1)/2.
交換回数O(n)、最良の場合は、すでに秩序化され、0回交換されている.最悪の場合,逆シーケンス,n−1回交換する.
選択ソートの交換回数はバブルソートよりも少なく,交換に必要なCPU時間は比較に必要なCPU時間よりも多く,n値が小さいため,選択ソートはバブルソートよりも速い.
複雑度分析:
ベストタイム:O(n^2)
平均時間複雑度:O(n^2)
最悪時間:O(n^2)
特徴分析:In-place sort,不安定アルゴリズム(stable sort)
例題1:挿入と選択ソートで、初期データが基本順であれば挿入ソート(末尾まで)、初期データが基本逆であれば選択ソート
例題2:下記のいくつかの並べ替え方法の中で、平均検索長(ASL)が最も小さいのはAである.ソートBを挿入する.クイックソートC.集計ソートD.ソートの選択