<span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">应用解释:要求找出一组数中的第n大的数字</span></span>
<span style="font-size: 13.3333px;">1.快速排序改进-1(快速选择算法)</span><p style="font-size: 13.3333px;"></p><p style="font-size: 13.3333px;">快速选择算法在于排除,因为一次快排之后便可以确定要找的数在那个子区间,然后不断递归知道找到解,如果没有解最终会导致left>right,从而返回-1,代表输入的要找的数比容量要大当然为了简化的话,是一定要进行剪枝,即当输入的数比容量大的时候直接返回error</p>
#include"iostream"
#include"cstdio"
using namespace std;
int a[]={0,1,32,43,6,5,67,6,765,7};
int length=0;
void swap(int x,int y)
{
int t;
t=a[x];
a[x]=a[y];
a[y]=t;
}
int quicksort(int left,int right,int num)
{
if(left>right) return -1; //查找不到
else
{
int i,j,t,temp;
i=left;
j=right;
temp=a[left];
while(i!=j)
{
while(i<j&&a[j]>=temp)
{
j--;
}
while(i<j&&a[i]<=temp)
{
i++;
}
if(i<j)
{
swap(i,j);
}
}
a[left]=a[i];
a[i]=temp;
if(i==num)
{
return a[i];
}
else
{
if(i>num) return quicksort(left,i-1,num);
else return quicksort(i+1,right,num);
}
}
}
int main()
{
int n;
cin>>n;
length=sizeof(a)/sizeof(int);
cout<<quicksort(1,length-1,n)<<endl;
return 0;
}
2.堆排序(构建大根堆,不断进行选择,录入结束,即求出了该数)
</pre><p></p><pre name="code" class="cpp">#include"iostream"
#include"cstdio"
using namespace std;
int a[]={0,1,33,5,57,2,456,76,354};
int n;
void swap(int x,int y)
{
int t=a[x];
a[x]=a[y];
a[y]=t;
}
void siftdown(int i)
{
int t,flag=0;
while(flag==0&&i*2<=n)
{
if(a[i]<a[i*2])
{
t=i*2;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(a[t]<a[i*2+1])
{
t=i*2+1;
}
}
if(t!=i)
{
swap(i,t);
}
else
{
flag=1;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
int p;
cin>>p;
while(p!=-1)
{
if(a[1]>p)
{
a[1]=p;
siftdown(1);
}
cin>>p;
}
cout<<a[1]<<endl;;
return 0;
}