Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速排序Q:有限多个不同的键_Java_C++_Sorting_Computer Science_Quicksort - Fatal编程技术网

Java 快速排序Q:有限多个不同的键

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个不同的键,所以这个分区中的不同键的数

需要显示一个具有特殊分区的快速排序,其中一个数组被划分为3个部分(<3 pivot,=to pivot,>than pivot)和一个大小为N的特殊数组,其中只有7个不同的键可能在O(N)中排序

所以,我想我们可以假设枢轴被选择在中间的某个地方(否则我们可以有像[ 0, 1, 2,3, 4, 5,6, 6, 6,6,…]之类的东西,应该取O(n ^ 2))。p> 以下是我的想法:
假设我们进行了第一次分区。现在我们进入递归步骤2。假设我们只关注右分区。因为这里的每个元素都大于pivot,并且只有7个不同的键,所以这个分区中的不同键的数量严格小于7。这意味着在算法迭代7次之后,左、右子分区中的所有元素都应该相同

现在,我可以看到,如果算法停止在常量数组上循环,这将是O(N),但我的理解是,它不会。如果不是这样,请澄清这一点


这是怎么回事

快速排序算法如下所示:

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个部分上都调用了快速排序