快速排序以及堆排序在查找数方面的主要应用 即将引出线性查找BFPRT算法

来源:互联网 发布:mac 管理员运行终端 编辑:程序博客网 时间:2024/06/06 02:56
<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;}


1 0