ソートアルゴリズム2:直接選択ソート
2486 ワード
直接選択ソートアルゴリズムも単純で直感的なアルゴリズムであり,バブルソートアルゴリズムとはわずかな違いしかない.
その時間的複雑度はO(n^2),空間的複雑度O(1)であり,不安定な並べ替えである.(配列で不安定、チェーンテーブルで安定)基本思想 ソートを直接選択するというのは、各ソートで最初に、ソートされていないキューのキューの先頭にあるIDを定義して、ソート中にソートされていないシーケンスの最大(小)値の位置を記録し、ソート中にソートされていないシーケンスの最大(小)値を直接選択し、ソート開始時に定義されたIDにその位置を記録することを考えているからです.最後に、識別された値を、ソートされていないキューヘッダの値と直接交換すると、このソートが完了します.交換時に判断する必要があり、自身がこのソートが秩序化されている(すなわち、識別された位置が変動せず、ソートされていないキューの先頭にある)場合、交換動作を行う必要はありません.とバブルソートの違い 一言でまとめると、泡は1つのソートで複数回交換される可能性がありますが、選択したソートは1つのソートで最大1回しか交換されません.
簡単に言えば、バブルソートと似ています.同様に、外側層はソートされたキューを維持するために1つのループを使用します.ただし、バブルソートは、内側層で定義された2番目のレイヤループ(すなわち、各ソート)で隣接する要素を2つ比較し、必要に応じて交換します.最悪の場合、このソートは比較のたびに交換され、効率が非常に低下します.一方、直接選択ソートは、内層のループで行われ、このソートを開始する前に、ソートされていないキューのキューヘッダに位置する識別を定義します.ソートされていないキューの各数は、現在指定されている数と比較され、要求(たとえば、指定されている値よりも小さい)に達した場合、その数の下付きラベルが、そのソートが終了するまで指定されます.最後に、指定された数と現在のソートされていないシーケンスを識別するキューを交換し(このソート自体がソートされている場合は交換する必要はありません)、このソートを完了します.具体的なコード(配列実装は小さいから大きいまで並べ替えられる)
ここでchange()関数は2つの数を交換する関数である.配列int arr[]={2,4,6,0,1}で;の最初のソートで説明します.
まず関数はarrとその長さ5を取得し,SelectSortソート関数に入る.外層ループ定義iは、並べ替えられた数字を記録する一方で、並べ替えられていないシーケンスのキューヘッダの下付き文字としても存在する.
現在並べ替えられている数字は0で、並べ替えられていないキューヘッダはarr[0]、すなわち2である.最初のソートが開始されます.
まず、minを識別子として定義(本例では小さいから大きいまで並べ替え)、その初期位置が未並べ替えシーケンスヘッダである(arr[0]).
内層サイクルに入る:arr[i+1](すなわち4)からarr[len](すなわち1)の終了まで、各数字とarr[min]を比較する.現在のarr[j]このときminは2を指し,4からそれぞれ2と比較する.j=3すなわちarr[j]==0ループを終了するとminは3でありarr[3]を表すのが今回の中で最小の数である.
一つの判断を行い、minとiが等しくなければ今回の交換が確実に必要であることを表し、arr[i]とarr[min]を交換する.
arrは{0,4,6,2,1}である.
このようにして、次のサイクルに入り、min=1、arr[min]=4で、新しいラウンドの比較を行います...その不安定性について これは,配列{5,5,2}を与え,最初の比較後2が最初の5と交換して{2,5,5}となり,このとき2つの5の相対位置が変化したことを実証している.
ただし,チェーンテーブルでのソート選択は安定しているが,配列では不安定である.
その時間的複雑度はO(n^2),空間的複雑度O(1)であり,不安定な並べ替えである.(配列で不安定、チェーンテーブルで安定)
簡単に言えば、バブルソートと似ています.同様に、外側層はソートされたキューを維持するために1つのループを使用します.ただし、バブルソートは、内側層で定義された2番目のレイヤループ(すなわち、各ソート)で隣接する要素を2つ比較し、必要に応じて交換します.最悪の場合、このソートは比較のたびに交換され、効率が非常に低下します.一方、直接選択ソートは、内層のループで行われ、このソートを開始する前に、ソートされていないキューのキューヘッダに位置する識別を定義します.ソートされていないキューの各数は、現在指定されている数と比較され、要求(たとえば、指定されている値よりも小さい)に達した場合、その数の下付きラベルが、そのソートが終了するまで指定されます.最後に、指定された数と現在のソートされていないシーケンスを識別するキューを交換し(このソート自体がソートされている場合は交換する必要はありません)、このソートを完了します.
void change(int arr[], int a,int b)
{
int tmp;
tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
void SelectSort (int arr[],int len)
{
for (int i = 0; i < len - 1 ;i++) //i ,i
{
int min = i; //min
for (int j = i + 1; j < len ; j++) //for (min)
{
if(arr[j] < arr[min])
{
min = j;
}
}
if (min != i) // , 。
{
change(arr,i,min);
}
}
}
ここでchange()関数は2つの数を交換する関数である.配列int arr[]={2,4,6,0,1}で;の最初のソートで説明します.
まず関数はarrとその長さ5を取得し,SelectSortソート関数に入る.外層ループ定義iは、並べ替えられた数字を記録する一方で、並べ替えられていないシーケンスのキューヘッダの下付き文字としても存在する.
現在並べ替えられている数字は0で、並べ替えられていないキューヘッダはarr[0]、すなわち2である.最初のソートが開始されます.
まず、minを識別子として定義(本例では小さいから大きいまで並べ替え)、その初期位置が未並べ替えシーケンスヘッダである(arr[0]).
内層サイクルに入る:arr[i+1](すなわち4)からarr[len](すなわち1)の終了まで、各数字とarr[min]を比較する.現在のarr[j]
一つの判断を行い、minとiが等しくなければ今回の交換が確実に必要であることを表し、arr[i]とarr[min]を交換する.
arrは{0,4,6,2,1}である.
このようにして、次のサイクルに入り、min=1、arr[min]=4で、新しいラウンドの比較を行います...
ただし,チェーンテーブルでのソート選択は安定しているが,配列では不安定である.