(バブリング、比較、高速行)は、3つのエントリレベルのソートアルゴリズムを詳細に話します

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;
}
公開された10元の記事 ウォン称賛7 ビュー160

おすすめ

転載: blog.csdn.net/qq_44204959/article/details/104681475