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

被折叠的 条评论
为什么被折叠?



