快速排序
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数
void qsort(int l,int r){ if(l==r)return; register int tmp,i=l,j=r,mid=x[l+rand()%(r-l+1)]; while(i<=j){ while(x[i]<mid)i++; while(x[j]>mid)j--; if(i<=j){ tmp=x[i],x[i]=x[j],x[j]=tmp,i++,j--; } } if(l<j)qsort(l,j); if(r>i)qsort(i,r); }
快速选择
该算法主要解决的问题:
有一个大小为 n的数组A[0,1,2,…,n-1],求其中第/前k大的数。
主要思想:
对于快速排序选数交换过后的两部分,有且只有一部分包含第k大的数
只对包含第k大的数的部分进行选数交换直到找到k
如果要求前k大的数,就选第k大的数然后前后交换,
将小于第k大的数的数放到第k大的数的前面,然后快排
int qselect(int l,int r,int k){ if(l==r)return x[l]; register int tmp,i=l,j=r,mid=x[l+rand()%(r-l+1)]; while(i<=j){ while(x[i]<mid)i++; while(x[j]>mid)j--; if(i<=j){ tmp=x[i],x[i]=x[j],x[j]=tmp,i++,j--; } } if(k<=j)return qselect(l,j,k); if(i<=k)return qselect(i,r,k); return tmp; }