求n个数中第k大的数、快速排序
- 求n个数中第k大的数
- #include <cstdlib>
- #include <iostream>
- /**
- *求一个数组中的第k大数
- *基本思想:
- *以最后一个元素x为轴,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
- *1.Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
- *2.Sa中元素的个数大于等于k,则返回Sa中的第k大数。
- *时间复杂度近似为O(n)
- */
- using namespace std;
- void exchange(int &a,int &b)
- {
- int temp;
- temp=a;
- a=b;
- b=temp;
- }
- //快排的partition函数
- int partition(int *a,int l,int r)
- {
- int i=l-1,j=l;
- int x=a[r];
- int temp;
- for(j=l;j<r;j++)
- {
- if(a[j]>=x) //把比x大的数往前放
- {
- exchange(a[j],a[i+1]);
- i++;
- }
- }
- exchange(a[r],a[i+1]);
- return i+1;
- }
- int k_element(int *a,int l,int r, int k)
- {
- if(l>=r)
- return a[l];
- int q=partition(a,l,r);
- if(q==k-1)
- return a[q];
- else if(q>=k)
- return k_element(a,l,q-1,k); //Sa中元素个数大于等于k
- else
- return k_element(a,q+1,r,k-(q+1)); //Sa中元素个数小于k
- }
- int main(int argc, char *argv[])
- {
- int a[100];
- int length;
- cin>>length;
- for(int i=0;i<length;i++)
- cin>>a[i];
- cout<<k_element(a,0,length-1,4)<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
- 快速排序
- #include <cstdlib>
- #include <iostream>
- using namespace std;
- int partition(int num[],int p,int r)
- {
- int i=p-1;
- int j;
- int x=num[r];
- int temp;
- for(j=p;j<r;j++)
- {
- if(num[j]<x)
- {
- temp=num[j];
- num[j]=num[i+1];
- num[i+1]=temp;
- i++;
- }
- }
- temp=num[r];
- num[r]=num[i+1];
- num[i+1]=temp;
- return i+1;
- }
- void quick_sort(int num[],int p,int r)
- {
- if(p>=r)
- return;
- int q=partition(num,p,r);
- quick_sort(num,p,q-1);
- quick_sort(num,q+1,r);
- }
- int main(int argc, char *argv[])
- {
- int num[100];
- int length;
- int i;
- cin>>length;
- for(i=0;i<length;i++)
- cin>>num[i];
- quick_sort(num,0,length-1);
- for(i=0;i<length;i++)
- cout<<num[i]<<" ";
- cout<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }