データ構造とアルゴリズムの交換ソート
6175 ワード
交換ソートは、その名の通り、2つの数またはいくつかの数の比較と交換によってソートの目的を達成するに違いない.交換ベースのソートには主にバブルソートと高速ソートがある.
1、泡立ち順
2つの間の比較と交換により、最大の記録(昇順)または最小の記録(降順)が毎回出てくる.
上記は従来のバブルソートであるが、最後尾のいくつかの記録が交換されていない、すなわち、後のいくつかの記録が秩序化されている場合、従来のバブルソートでは、どうしてもバブルが発生し、自然にソート時間が増加する.従って、上記従来の発泡ソートを改良することができる.次のように、交換のたびに最後の位置をexchangeIndexで記録します.
2、クイックソート
クイックソート:シーケンス内のレコードを基準に、シーケンス全体を左右の2つのグループに分け、左のシーケンスは基準より小さく、右のシーケンスは基準より大きい.次に、左右のシーケンスに対してもう1つの基準区分を選択し、左右のシーケンスの記録数が0になるまで順次下ります.
3、まとめ
バブルソート:時間複雑度o(n 2)は、安定したソートアルゴリズムである.
高速ソート:時間複雑度o(nlog 2 n)は、不安定なソートアルゴリズムであり、すべてのソートアルゴリズムの中で平均性能が最も優れている.
しかし、並べ替えられるシーケンスが本来秩序化されているか、またはほぼ秩序化されていると、高速並べ替えの性能が悪くなり、時間的複雑度o(n 2)に劣化する.したがって、高速ソートはランダムなシーケンスのソートに適しています.
1、泡立ち順
2つの間の比較と交換により、最大の記録(昇順)または最小の記録(降順)が毎回出てくる.
void bubbleSort(int arr[],int n){
int outer,inner;
for(outer=1;outer<=n;outer++){
for(inner=1;inner<=n-outer;inner++){
if(arr[inner+1]<arr[inner]){
arr[0] = arr[inner];
arr[inner] = arr[inner+1];
arr[inner+1] = arr[0];
}
}
}
}
上記は従来のバブルソートであるが、最後尾のいくつかの記録が交換されていない、すなわち、後のいくつかの記録が秩序化されている場合、従来のバブルソートでは、どうしてもバブルが発生し、自然にソート時間が増加する.従って、上記従来の発泡ソートを改良することができる.次のように、交換のたびに最後の位置をexchangeIndexで記録します.
void bubbleSortModified(int arr[],int n){
int outer,inner;
int exchangeIndex = n;
int exchange;
while(exchangeIndex>1){
exchange = 1;
for(inner=1;inner<=exchangeIndex;inner++){
if(arr[inner+1]<arr[inner]){
arr[0] = arr[inner];
arr[inner] = arr[inner+1];
arr[inner+1] = arr[0];
exchange = inner;
}
}
exchangeIndex = exchange;
}
}
2、クイックソート
クイックソート:シーケンス内のレコードを基準に、シーケンス全体を左右の2つのグループに分け、左のシーケンスは基準より小さく、右のシーケンスは基準より大きい.次に、左右のシーケンスに対してもう1つの基準区分を選択し、左右のシーケンスの記録数が0になるまで順次下ります.
int _quickSort(int arr[],int begin,int end){
arr[0] = arr[begin];
while(begin < end){
while(begin<end && arr[end]>arr[0])
end --;
if(begin<end)
arr[begin] = arr[end],arr[end] = arr[0],begin ++;
else
return begin;
while(begin<end && arr[begin]<arr[0])
begin ++;
if(begin<end)
arr[end] = arr[begin],arr[begin] = arr[0],end --;
else
return end;
}
}
void quickSort(int arr[],int begin,int end){
int middle;
if(begin < end){
middle = _quickSort(arr,begin,end);
quickSort(arr,begin,middle-1);
quickSort(arr,middle+1,end);
}
}
3、まとめ
バブルソート:時間複雑度o(n 2)は、安定したソートアルゴリズムである.
高速ソート:時間複雑度o(nlog 2 n)は、不安定なソートアルゴリズムであり、すべてのソートアルゴリズムの中で平均性能が最も優れている.
しかし、並べ替えられるシーケンスが本来秩序化されているか、またはほぼ秩序化されていると、高速並べ替えの性能が悪くなり、時間的複雑度o(n 2)に劣化する.したがって、高速ソートはランダムなシーケンスのソートに適しています.