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

Java 使用分区查找列表中第k个最小的元素-帮助我理解,java,algorithm,selection,quicksort,Java,Algorithm,Selection,Quicksort,好的,我有一个任务,用几种不同的方法找到列表中第k个最小的元素 第一种方法是对列表进行排序,然后返回第k个最小元素。简单,我的想法是说列表=10个元素,按升序对列表排序,然后将元素返回到第10位 下一个方法使用来自快速排序的分区: “第二种算法是应用快速排序中使用的过程分区。该过程对一个数组进行分区,使数组中小于某个透视项的所有元素位于该数组的前面,而大于该透视项的所有元素位于该数组的后面。枢轴项目所在的插槽称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第k个插槽。如果k小于piv

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

第一种方法是对列表进行排序,然后返回第k个最小元素。简单,我的想法是说列表=10个元素,按升序对列表排序,然后将元素返回到第10位

下一个方法使用来自快速排序的分区:

“第二种算法是应用快速排序中使用的过程分区。该过程对一个数组进行分区,使数组中小于某个透视项的所有元素位于该数组的前面,而大于该透视项的所有元素位于该数组的后面。枢轴项目所在的插槽称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第k个插槽。如果k小于pivotposition,则递归地划分左子数组,如果k大于pivotposition,则递归地划分右子数组。当k=枢轴位置时,我们就完成了。”

假设我有一个包含10项的列表:

3 8 9 2 4 5 1 7 10 6,以5为轴心..我知道我通常会有2个数组

3 2 4 1和8 9 7 10 6

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

第k个槽是什么?对我来说,我一直认为第k个槽=数组的长度,所以在这个例子中是10。其中有6个值,这显然不是最低的,而且是不正确的


有人可以使用这个示例数组,告诉我这个算法是什么意思,以及它是如何找到第k个/最小的元素的吗?感谢快速排序中的一旦你的轴心位置为k,左边的所有元素都会变小,右边的所有元素都会变大,所以如果你只需要第k个值,就不需要继续排序了。

我想你已经做到了我用一种复杂的方式来看待这个解决方案

这就是使用快速排序查找第k个最小元素的方式(我将告诉您原因,这并不完全是快速排序)

在快速排序中,选择一个随机枢轴元素,将整个数组分成两部分,然后对左右子数组进行递归排序,以形成整个排序数组

在这个问题上你不必那么做你所做的就是

  • 选择一个随机轴元素
  • 使用[Sub-array 1]Pivot[Sub-array2]分割阵列,其中子阵列1的元素数小于Pivot,而子阵列2的元素数小于Pivot 大于枢轴
  • 检查子阵列1的尺寸
  • 所以为了解决你的疑问

    在这里,您不是对整个数组进行排序,而是对数组的一部分进行排序 即使那也不是完全正确的。如果你完全正确,你会得到它的 请理解我的上述解释。)


    您中途重新定义了k:第一个k是所搜索元素的顺序(可能小于数组的长度,例如,从1开始计数时,10个元素数组中第二小的元素的k=2)然后你说k是数组的长度。第k个槽就是数组中的第k个位置。好吧,这澄清了一些误解。但我仍然感到困惑。比如说我给出的示例数组,让我们假设我想找到第三小元素,轴总是第一项。我想我不明白如何知道“什么?”“是数组完全排序之前的第三小元素吗?”?我想我只需要有人来为我显示它,这样我就能理解…我怎么知道k是否小于或大于枢轴位置?这是基于的重要属性:快速排序的分区函数确保枢轴之前的所有元素都小于或等于枢轴(尽管不必排序)轴之后的所有元素都比轴大(同样,不一定排序)。。我明白这一切。但是我觉得我只能在列表完全排序后才能知道第k个最小的元素。我想我不明白的是,如果不完全排序,我怎么知道轴心位置是否为k?从我的示例中,让我们假设我想要第三个最小的元素。。我怎么知道当我的枢轴位置变为“3”时,那是第三小元素,除非数组被完全排序,我可以这样检查?如果这有意义的话,..k是给定的,那么如果你的枢轴位置是k,那么你就完成了。您可能需要在PIVOT=K之前对整个数组进行排序,例如K=1或2,然后在中间开始快速排序。好吧,我想我现在感觉很慢。但对我来说,这听起来像是k=3,那么这意味着当枢轴位置的元素为9时,算法结束?如果k=3,当枢轴位置为3时,您将返回值“3”
       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