快排是利用的partition算法,基本思想是从第一个数开始,利用partition算法将这个数在有序序列中的位置找到,这个数的左边部分都是小于它的数,右边部分都是大于他的数,然后通过分治的方法对左右两个区间再进行partition操作,partition算法代码如下:
int partition(int a[], int start, int end) {
int p = a[start];
while (start < end) {
while (start < end&&a[end] >= p)
end--;
a[start] = a[end];
while (start < end&&a[start] <= p)
start++;
a[end] = a[start];
}
a[start] = p;
return start;
}
所以求第k小数的代码:
int kmin(int a[], int begin, int end)
{
if (begin >= end)
return begin;
int mid = partition(a, begin, end);
if (mid == 3) { //此时k=3,k的取值从0到9
return a[mid];
}
else if (mid < 3)
return kmin(a, mid + 1, end); //说明在右区间内
else
return kmin(a, begin, mid-1);
}
快排代码:
void quicksort(int a[], int start, int end) {
if (start >= end)
return;
int mid = partition(a, start, end);
quicksort(a, start, mid - 1);
quicksort(a, mid + 1, end);
}