算法思想:
时间复杂度:O(n)
在快速排序的过程中,可以分为两段,
[
l
,
j
]
[l,j]
[l,j]这段都是小于等于随机值的
[
j
+
1
,
r
]
[j + 1,r]
[j+1,r]这段都是大于等于随机值的
左边这段有
j
−
l
+
1
j - l + 1
j−l+1 个数(记作
s
l
sl
sl)
也就是说第
1
1
1 ~
s
l
sl
sl (包括sl)小的数字都在左边
第
s
l
+
1
sl + 1
sl+1 ~
n
n
n 小的数字都在右边
如果
k
k
k 是在左边,那直接在左边求即可
如果
k
k
k 是在右边,那么直接在右边求即可,此时第k小变为第
k
−
s
l
k - sl
k−sl 小
int qsort(int q[],int l,int r,int k)
{
if(l == r) return q[l];
int x = q[l + r >> 1],i,j;
i = l - 1,j = r + 1;
while(i < j)
{
while(q[++i] < x);
while(q[--j] > x);
if(i < j) swap(q[i],q[j]);
}
int sl = j - l + 1;
if(k <= sl) qsort(q,l,j,k);
else qsort(q,j + 1,r,k - sl);
}