分割統治方法の例

最大と二番目に大きいユアン検索

アルゴリズムの説明:
一つの要素、それ自体、二つの要素二番目に大きい最大値は、より大きな最大値、二番目に大きい値が小さい場合、サブ問題、比較、または2つの要素に問題を分割します。最小でない場合は、問題は小さな問題に分割します。後者は、最大値の最大値と最大値MAX1よりも大きい場合、最終的に、前部が大きい第2の最大値は、第2の最大の値を比較し、4つの数を比較し、二番目に大きい極大値の最大値と時間の後の期間をバック渡し。この重要な問題は、2と二番目に大きい最大値を比較する方法です。
出典:

#include <iostream>
using namespace std;
int a[100];

/*求最大值和次大值*/
void Max12(int i,int j,int &max,int &mimax){
	int max1,mimax1;
	if(i==j){//一个元素时,最大值次大值是本身
		max=mimax=a[i];
	}
	else if(i==j-1){//两个元素时,最大值是较大的一个,次大值是小的
		if(a[i]<a[j]){
			max=a[j];mimax=a[i];
		}
		else{
			max=a[i];mimax=a[j];
		}
	}

	else{//其他情况时调用Max12,将问题分解
		int m=(i+j)/2;
		Max12(i,m,max,mimax);
		Max12(m+1,j,max1,mimax1);

		if(max1>max){//如果后面最大值比最大值大,改变最大值次大值
			mimax=max;
			max=max1;
			if(mimax1>mimax)
				mimax=mimax1;
		}
		else if(max1>mimax){//后面最大值大于次大值,改变次大值
			mimax=max1;
		}
	}
}

int main(){
	int n,i;
	int max,mimax;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];

	max=a[0];//给最大值次大值初始化
	mimax=a[0];

	Max12(0,n-1,max,mimax);
	cout<<max<<" "<<mimax<<endl;
	return 0;
}

クイックソート

アルゴリズムの説明:
パーティション関数を記述するためにクイックソートを書き込む前に、降順で与えられたクイックソート配列を有します。関数は、左側の最初の1、右側の小さな場所よりも大きな値に分けることができます。ここでは、監視ポストを設定し、シーケンスの割り当ての終わりには、国境を越えた私を防ぐために、微小です。あなたが最初よりも大きな値を見つけるまで、あなたが最初のピットストップよりも小さい値、前進jの停止を見つけるまで、私は後方に行く、私ならば、jは、私は、までは、為替の2つの要素をずらしていない、jは千鳥。最後に、jの値と値の交換は、最初の値は順番をラインアップします。

出典:

#include <iostream>
using namespace std;
int a[100];

/*从大到小划分函数*/
int Pa(int left,int right){
	int i=left;
	int j=right+1;
	int temp=a[j];//暂时保留right后面的元素,并把他的值变为无穷大
	a[j]=0x80000000;
	do{
		do
			i++;
		while(a[i]>a[left]);//i找比第一个值小的

		do
			j--;
		while(a[j]<a[left]);//j找比第一个值大的

		if(i<j)
			swap(a[i],a[j]);//把大的和小的交换位置
	}while(i<j);

	swap(a[left],a[j]);
	a[right+1]=temp;
	return j;
}

/*快速排序*/
void QuickSort(int left,int right){
	if(left<right){
		int j=Pa(left,right);
		QuickSort(left,j-1);
		QuickSort(j+1,right);
	}
}

int main(){
	int i,n;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	a[n]=0x80000000;//最后为无穷大,当做监视哨
	QuickSort(0,n-1);
	for(i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

kの小さな要素を探します

アルゴリズムの説明:
patitionパーティション機能を使用して、k個の小さな要素を見つけ、小さな最初のJ + 1を見つけるために時間を見つけて、この部門の利点を活用していない小さなKの最初まで関数を呼び出すされた、比較とjがあることに注意してくださいkは、バイナリ検索に似たオーダーの大きさ、大J、Jあなたが見つけるまで、右を探して、時間の左側を見つけるを減らすために呼び出します。

出典:

#include <iostream>
using namespace std;
int a[100];

/*从小到大划分函数*/
int Pa(int left,int right){
	int i=left;
	int j=right+1;
	int temp=a[j];
	a[j]=0x7fffffff;
	do{
		do
			i++;
		while(a[i]<a[left]);

		do
			j--;
		while(a[j]>a[left]);

		if(i<j)
			swap(a[i],a[j]);
	}while(i<j);
	swap(a[left],a[j]);
	a[right+1]=temp;
	return j;
}

/*这是找到第k小的元素位置*/
int find(int left,int right,int k){
	int j;
	j=Pa(left,right);
	do
	{
		if(j>k)//如果j是大的,K小肯定在左边
			j=Pa(left,j-1);
		else if(j<k)//j大,k小在右边
			j=Pa(j+1,right);
	}while(j!=k);//循环直到找到第k小
	return j;
	
}

int main(){
	int n,i,j;
	int x;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	j=find(0,n-1,x-1);//x-1是为了适应数组下标
	cout<<a[x-1]<<endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/jihome/article/details/94966165