Java 使用分区查找列表中第k个最小的元素-帮助我理解
好的,我有一个任务,用几种不同的方法找到列表中第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个值,这显然不是最低的,而且是不正确的Java 使用分区查找列表中第k个最小的元素-帮助我理解,java,algorithm,selection,quicksort,Java,Algorithm,Selection,Quicksort,好的,我有一个任务,用几种不同的方法找到列表中第k个最小的元素 第一种方法是对列表进行排序,然后返回第k个最小元素。简单,我的想法是说列表=10个元素,按升序对列表排序,然后将元素返回到第10位 下一个方法使用来自快速排序的分区: “第二种算法是应用快速排序中使用的过程分区。该过程对一个数组进行分区,使数组中小于某个透视项的所有元素位于该数组的前面,而大于该透视项的所有元素位于该数组的后面。枢轴项目所在的插槽称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第k个插槽。如果k小于piv
有人可以使用这个示例数组,告诉我这个算法是什么意思,以及它是如何找到第k个/最小的元素的吗?感谢快速排序中的一旦你的轴心位置为k,左边的所有元素都会变小,右边的所有元素都会变大,所以如果你只需要第k个值,就不需要继续排序了。我想你已经做到了我用一种复杂的方式来看待这个解决方案 这就是使用快速排序查找第k个最小元素的方式(我将告诉您原因,这并不完全是快速排序) 在快速排序中,选择一个随机枢轴元素,将整个数组分成两部分,然后对左右子数组进行递归排序,以形成整个排序数组 在这个问题上你不必那么做你所做的就是
您中途重新定义了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