寻找数组中第K个大小的数的快速排序变种解法

    有一个数组,其大小已知,现在要找出其中第K个大小的数。作为最基本的算法,我们可以先对整个数组进行排序,然后直接找出第K个最小的数即可,但这种解法必须要有一个排序的过程,且排序的结果对于所要求的结果没有直接关系。现在我们通过一个快速排序的变种算法来解决这个问题。
    同样是采取分治法,我们将整个数组一分为二,将小的放到左边,将大的放到右边,并判断K和这两边的子数组长度的大小。如果K的left数组小,则K所在的数必定在left数组之中,否则则在right数组当中。这样就直接去掉接近于一半的数组。然后使用递归再在剩余的left数组中来查找。
    整个过程可以描述成以下过程:

  1. 使用快速排序的pivot分割过程,将数组分割成left数组和right数组以及pivot三个部分
  2. 如果left数组长度大于K,则继续在left数组中查找,否则在right数组中查找

    在上述的描述过程中,有几个特殊点是我们需要考虑的:

  1.     如果K=1,则表示要找的数即整个数组中最小的数,那么直接查找最小的数即可
  2.     如果K=数组长度,则表示要找的数即整个数组中最大的数,那么直接查找最大的数即可
  3.     在数组分割之后,如果K=left数组长度+1,即pivot即是我们所要找的数,直接返回即可

    有了以上的描述,那么整个实现过程就不再复杂了。整个实现过程如下所示

继续阅读“寻找数组中第K个大小的数的快速排序变种解法”