1.比較ソート
比較ソート最初の要素から開始し、最も明白な白選別方法であり、順次最初の要素よりも小さいすべての後続の要素を比較し、これら2つの要素が交換され、最終的に第1の比率を完了します最初の要素は、最小でなければならず、第2の要素、構成要素およびすべての後続の比較、完成の比から出発し、2番目の要素はn-1個の端部よりも第2小、共感、ありますすべての順序付けられた配列となって、ホイール(N配列要素の数です)。比較ソートは、安定した交換が発生しないように値が検出される、大きな、保持位置であり、その時間複雑度はO(N ^ 2)は、次のコードです。
#include <iostream>
using namespace std;
void swap(int* a,int* b){//交换
int temp=*a;
*a=*b;
*b=temp;
}
void Sort(int a[],int len){
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(a[i]>a[j]){
swap(a[i],a[j]);
}
}
}
}
int main(){
int a[10]={8,6,9,7,3,0,2,5,1,4};
cout << "排序前的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
Sort(a,10);
cout << "排序后的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
return 0;
}
2.バブルソート
バブルソートソートアルゴリズムで名前が示すとおり、ほとんどがゆっくりとトップの下から上昇したように、単に、水膨れを取る、、、バブルソートの古典です。バブルソート、最終的な表面の最大値がゆっくりと変化することがので、バブルソートのn-1倍でなければならないことは、比較される隣接する要素であり、安定し、その時間計算量はO(N ^ 2)、として、次のとおりです。
#include <iostream>
using namespace std;
void swap(int* a,int* b){//交换
int temp=*a;
*a=*b;
*b=temp;
}
void Sort(int a[],int len){
for(int i=0;i<len-1;i++){
for(int j=0;j<len-i-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
}
}
int main(){
int a[10]={8,6,9,7,3,0,2,5,1,4};
cout << "排序前的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
Sort(a,10);
cout << "排序后的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
return 0;
}
3.クイックソート
クイックソート高速行を呼ぶ、ソーティングの最も一般的な方法で、ソート()メソッドが速い行であるC ++ STLライブラリ(最適化)。クイックソートあなたが最初のイデオロギー分割統治を理解する必要があります理解し、あなたは、大きな問題が解決されますを解決するために、すべての小さな問題を置いたときに簡単に、解決するために小さな問題に大規模で複雑な問題についてです。高速放電アイデアはバック非常に速く放電来る:配列をソートする基準値を見つけ、アレイは、2つのセクションに分類され、全体の最初のセクションでは、全体がこの参照値の2番目の段落の値よりも大きい以下の基準値の値以上であります。これらの配列全体が秩序になってまで、この操作を繰り返します。つまり、「全体の秩序、部分的障害」。前記選択された行の価値効率、迅速ドレイン平均の複雑さに関連する基準速度O(N * LOGN)配列が完全に逆である場合、高速行縮重複雑にO(N-2 ^) 。基準値(速い行の最適化)ここでは拡大しないように選択に関しては、我々は一般的に基準値として、最も左の素子間隔を選択します。
どの範囲のセグメントへの私たちの問題は、そう?また、クイックドレーンコアである:クロススキャン、スイッチング素子の位置
例は:ソートする配列である:8697302514
この場合、基準値フラグ= 8、左端の添字間隔左= 0、右端の添字右= 9;右9右端からスキャンを開始する(我々は、基準値は、左端の要素の値である選択されたため)、4 <図8において、左側は4〜8の代表であるべきで、我々はその位置を交換する、アレイは次のようになる。4 6 9 7 3 0 2 5 1 8、左= 0、右= 9 次いでから始まり左= 0 ,, 4左掃引します<= 8,4は、次のスキャンが、6 <= 8、6が正しい位置、次いで、次のスキャン、=> 8,9 9において、左側8の代表であるべきで、正しい位置に、左側8の代表であるべきである。8右側にあるべきです、J交換は、アレイは次のようになる。4 6 8 7 3 0 2 5 1 9、右= 9、2 =左、この操作を繰り返し(何交換が前方継続しない(上の他の交換機からスキャン)した後左まで開始走査)> =右、それが表している配列は、多くのセグメントに分割されています。アレイは、多数のセグメントに分割される:ソートする46173025に分割し、4617302589およびすべてのセクションがソートされるまで二つの部分9は、上記の動作が繰り返されます(ソートされた各要素の位置)が適切ですが、完了です。:ことに注意してください、高速放電が不安定です。上記の考え方に基づいて、我々は次のようなコードを書くことができます。
コードは次のように詳細なメモが含まれています:()
#include <iostream>
using namespace std;
void swap(int *a,int *b){//交换
int temp=*a;
*a=*b;
*b=temp;
}
int partition(int left,int right,int a[]){//使基准值左边全小于基准值,基准值右边全大于基准值
int flag=a[left];//基准值,一般选取区间最左边的元素
while(left<right){
//先从后往前扫,如果比基准值小,将两个值交换
while(left<right && a[right]>=flag) right--;
swap(&a[left],&a[right]);
//然后从前往后扫,如果比基准值大,将两个值交换
while(left<right && a[left]<=flag) left++;
swap(&a[left],&a[right]);
}
return left;//返回基准值的下标,以此为分界线,将区间划分成两个小区间
}
void quickSort(int start,int end,int a[]){//递归调用(分治思想),直至所有的元素
if(start<end){
int flag=partition(start,end,a);
quickSort(start,flag-1,a);
quickSort(flag+1,end,a);
}
}
int main(){
int a[10]={8,6,9,7,3,0,2,5,1,4};
cout << "排序前的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
quickSort(0,9,a);
cout << "排序后的数组:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << " ";
if(i==9) cout << endl;
}
return 0;
}