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; } }