Java 快速排序Q:有限多个不同的键
需要显示一个具有特殊分区的快速排序,其中一个数组被划分为3个部分(<3 pivot,=to pivot,>than pivot)和一个大小为N的特殊数组,其中只有7个不同的键可能在O(N)中排序Java 快速排序Q:有限多个不同的键,java,c++,sorting,computer-science,quicksort,Java,C++,Sorting,Computer Science,Quicksort,需要显示一个具有特殊分区的快速排序,其中一个数组被划分为3个部分(than pivot)和一个大小为N的特殊数组,其中只有7个不同的键可能在O(N)中排序 所以,我想我们可以假设枢轴被选择在中间的某个地方(否则我们可以有像[ 0, 1, 2,3, 4, 5,6, 6, 6,6,…]之类的东西,应该取O(n ^ 2))。p> 以下是我的想法: 假设我们进行了第一次分区。现在我们进入递归步骤2。假设我们只关注右分区。因为这里的每个元素都大于pivot,并且只有7个不同的键,所以这个分区中的不同键的数
所以,我想我们可以假设枢轴被选择在中间的某个地方(否则我们可以有像[ 0, 1, 2,3, 4, 5,6, 6, 6,6,…]之类的东西,应该取O(n ^ 2))。p>
以下是我的想法:
假设我们进行了第一次分区。现在我们进入递归步骤2。假设我们只关注右分区。因为这里的每个元素都大于pivot,并且只有7个不同的键,所以这个分区中的不同键的数量严格小于7。这意味着在算法迭代7次之后,左、右子分区中的所有元素都应该相同
这是怎么回事 快速排序算法如下所示:
quicksort(A, lo, hi):
if lo < hi:
p := partition(A, lo, hi)
quicksort(A, lo, p - 1)
quicksort(A, p + 1, hi)
快速排序(A、lo、hi):
如果lo我们有一个特殊的分区,它是3路的,所以假设它返回它选择的任何轴的相等范围,我们只需要在它上面和下面:
quicksort(A, lo, hi):
if lo < hi:
p1, p2 := 3-way-partition(A, lo, hi)
quicksort(A, lo, p1 - 1) // (1)
quicksort(A, p2 + 1, hi) // (2)
快速排序(A、lo、hi):
如果lo现在,考虑最坏的情况。我们有一个数组,看起来像
每次递归调用都会将问题大小减少一个,直到第七次递归调用(将选择[0,1,2,3,4,5,6,6,6…]
,我们的轴选择算法尽可能愚蠢:它严格按照递增顺序选择轴。在这种情况下,第一个递归调用((1)
)将始终不起任何作用,因为没有比枢轴更小的调用。所以我们只处理一个递归调用,大小为N-1
每次递归调用都会将问题大小减少一个,直到第七次递归调用(将选择
6
pivot)完成排序为止。这是仅有7个不同键的关键步骤-您最多只需要7个调用。这7个调用中的每一个都会迭代整个数组。。。这就是O(7N)=O(N)。更一般地说,如果只有k
不同的键,您可以说最坏的情况是来自同一参数的O(kN)
?提示:如果我们假设轴选择位于中间O(NlgN),那么对数组排序的最坏情况是什么。如果pivot是第一个条目,那么O(N^2)@user96454不正确。在最坏的情况下,需要多少递归调用?如果只有7个不同的键。。。你需要坚持快速排序吗?Bucket数数我们的基数排序可能是你的朋友我有几个问题。首先,这正是我在说O(N^2)时所想的,但是从你描述的情况来看,当它达到6时,算法停止。我的理解是,默认情况下的快速排序没有“检测”已排序数组的机制,它将继续将问题分解到最小大小。这就是为什么当选择6
作为轴心时,我没有假设算法会停止。@user96454好吧,给定一个只包含6
s的数组,3路分区
会做什么?啊,我刚刚得到一个事实,您没有在中间分区上调用quicksort,而[6,6,…]肯定是这样的。有道理,我在分区的所有3个部分上都调用了快速排序