最大と二番目に大きいユアン検索
アルゴリズムの説明:
一つの要素、それ自体、二つの要素二番目に大きい最大値は、より大きな最大値、二番目に大きい値が小さい場合、サブ問題、比較、または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;
}