<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; }
时间: 2024-10-12 12:50:21