快排以及查找第K元素

来源:互联网 发布:淘宝上的水弹枪合法吗 编辑:程序博客网 时间:2024/05/14 18:07

1.快排。

快排,合并排序什么的必须熟练掌握啊,这么经典的算法。。。

int qsort_aux(int A[],int p,int q) {        //选择最后一个元素x做为参照,将小于x和大于x的元素放在x两侧    int i=p-1,j,x=A[q];    for(j=p;j<q;j++) {        if(A[p]<=x) swap(A[++i],A[j]);    }    swap(A[++i],A[q]);        //返回x所在的位置,则左边的元素小于x,右边的大于x    return i;}                                 void qsort_complete(int A[],int p,int q) {    if(p<r) {        int r=qsort_aux(A,p,q);        qsort_complete(A,p,r-1);        qsort_complete(A,r+1,q);    }}

2.寻找第k元素。

第一种简单的想法是先将数组排序,再取第k小元素,根据不同的算法可以知道这种算法的时

间复杂度。如果用快排、合并排序堆排序什么的,时间复杂度为O(NlgN);如过用冒泡或者

插入排序,时间复杂度为O(N^2);当然也有些线性时间排序算法,但是限制条件比较多不

常用。

第二种是采用快排的思想。选取一个数做为参照,把数组元素分为两边,直到找到第k个元素。

这样的时间复杂度为T(n)=O(n*(1+1/2+1/2^2+1/2^3+...1/2^lgn))(这尼玛不会算,囧了。。

)显然有T(n)<O(nlgn)。

int kth_elem(int A[],int n,int k) {    int low=0,high=n-1;    int i,j,x;        //和快排的思想一致,先选取一个数做为参照,分在两边,直到找到第k个元素。这样就可以不用先排序,再去第ku元素。    while(low<=high) {        i=low-1;    x=A[high];        for(j=low;j<=high;j++) {            if(A[j]<=x) swap(A[++i],A[j]);        }        swap(A[++i],A[j]);        if(i==k)        return A[i];        else if(i<k) low=i+1;        else            high=i-1;    }}
原创粉丝点击