使用分区查找列表中的第K个最小元素 - 帮助我理解

时间:2012-03-03 02:08:50

标签: java algorithm selection quicksort

好的,我有一个任务,使用几种不同的方法在列表中找到第K个最小元素....

第一种方法是对列表进行排序,然后返回第K个最小元素。容易,我的心态是说list = 10个元素,按升序排序列表,然后返回第10个位置的元素

下一个方法使用Quicksort中的Partition:

“第二种算法是应用Quicksort中使用的过程分区。该过程对数组进行分区,使得小于某个数据透视项的所有元素都位于数组之前,并且所有大于该数据透视项的元素都来自它。枢轴项所在的槽被称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第k个槽。如果k小于pivotposition,我们通过递归分区左子阵列来实现这一点。如果k大于pivotposition,则通过递归分区右子阵列。当k = pivotposition时,我们就完成了。“

说我有10个项目的清单:

3 8 9 2 4 5 1 7 10 6,5是枢轴..我知道我通常会有2个阵列

3 2 4 1和8 9 7 10 6

但我不明白的是:“我们可以通过分区来解决选择问题,直到枢轴项目位于第k个位置。”

什么是第k个插槽?对我来说,我一直在想kth =数组的长度,所以在这种情况下10.它将有6个值,这显然不是最低的......并且不正确。

有人可以使用这个样本数组,有点只是告诉我这个算法意味着什么以及它如何找到第k个/最小元素?感谢

2 个答案:

答案 0 :(得分:2)

我认为你已经以复杂的方式看待解决方案。

这是你使用QuickSort找到第k个最小元素的方法(不完全是快速排序,我会说明原因)。

在快速排序中,您选择一个随机数据元素并将整个数组分成两个,并递归排序左右子数组以形成整个排序数组。

在这个问题上,您不必这样做。你所要做的就是,

  
      
  1. 选择随机数据元素。
  2.   
  3. 用[Sub-array 1] Pivot [Sub-array2]划分数组,其中Subarray 1的元素小于pivot,sub-array2包含元素   大于枢轴。
  4.   
  5. 检查子阵列1的大小。
  6.   
   If it is,
        a.Greater than 'k' then your kth element lies in the first sub-array. Go recursively. Start sorting the sub-array1 alone and you can entirely discard the sub-array2 as you can be sure that 'kth' element cannot occur at a position greater than k! Repeat step-1 for the right sub-array
        b.Lesser than 'k' then your kth element lies in the second sub-array. Again do as said above. Repeat step-1 for left subarray.
        c.If the size of sub-array1 is k-1 then your pivot element must be the kth largest element in your array.Bingo! you have your 'kth' largest element in the array

所以要解决你的疑问,

  

这里你没有对整个数组进行排序,只是对数据的一部分进行排序   (即使这不完全是真的。如果你完全的话,你会得到它   理解我的上述解释。)

答案 1 :(得分:0)

在Quicksort中,一旦您的枢轴位置为k,左侧的所有内容都会减少,右侧的所有内容都会更大,因此如果您只需要第k个值,则无需继续排序。