Algorithm 快速排序二进制数组

Algorithm 快速排序二进制数组,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,我想知道在最坏的情况下,快速排序需要对大小为n的二进制数组进行多少次比较 我不知道这个问题最坏的情况是什么[01 01 01..]? 干杯, eo不完全是快速排序,但如果您想对二进制数组进行排序,可以在O(n)中进行排序。数一数你有多少个1和0,然后按你想要的顺序写 例如,对于以下阵列: [0 1 0 1 0 1 1] 你可以用O(n)来计算,你有三个0和四个1。然后,您只需先用三个0重写数组,然后用四个1重写数组。不完全是快速排序,但如果您想对二进制数组进行排序,可以用O(n)来完成。数一数

我想知道在最坏的情况下,快速排序需要对大小为
n
的二进制数组进行多少次比较
我不知道这个问题最坏的情况是什么<代码>[01 01 01..]?
干杯,

eo不完全是快速排序,但如果您想对二进制数组进行排序,可以在O(n)中进行排序。数一数你有多少个1和0,然后按你想要的顺序写

例如,对于以下阵列:

[0 1 0 1 0 1 1]

你可以用O(n)来计算,你有三个0和四个1。然后,您只需先用三个0重写数组,然后用四个1重写数组。

不完全是快速排序,但如果您想对二进制数组进行排序,可以用O(n)来完成。数一数你有多少个1和0,然后按你想要的顺序写

例如,对于以下阵列:

[0 1 0 1 0 1 1]

你可以用O(n)来计算,你有三个0和四个1。然后,您只需先用三个0重写数组,然后再用四个1即可。

对包含少量唯一键的数组进行排序在实践中很常见。 当唯一密钥的数量为O(1)时,我们需要一种适用于O(n)时间的算法。 在您的情况下,只有两个唯一的键

快速排序平均是O(nlogn),但在最坏的情况下是O(n^2),对于您的情况,我已经在这个数组上测试了快速排序算法
[01 01 01 01 01 01 01][/code>,数组的长度是
13
个元素,该算法需要
170
次迭代来排序这个数组,即
n^2

O(n)算法的伪代码:

let n0 <- 0;
for i=0  to lenght(A)
    if A[i] == 0
        A[n0] = 0;
        ++n0

for i=n0 to lenght(A)
    A[i] = 1

让n0对包含少量唯一键的数组进行排序在实践中很常见。
当唯一密钥的数量为O(1)时,我们需要一种适用于O(n)时间的算法。
在您的情况下,只有两个唯一的键

快速排序平均是O(nlogn),但在最坏的情况下是O(n^2),对于您的情况,我已经在这个数组上测试了快速排序算法
[01 01 01 01 01 01 01][/code>,数组的长度是
13
个元素,该算法需要
170
次迭代来排序这个数组,即
n^2

O(n)算法的伪代码:

let n0 <- 0;
for i=0  to lenght(A)
    if A[i] == 0
        A[n0] = 0;
        ++n0

for i=n0 to lenght(A)
    A[i] = 1

设为n0最坏的情况是O(n2)与内容无关,但如果知道数组仅由0和1组成,则平均为O(n log n),然后不要使用快速排序。一次分区传递就足够了。我知道这不是使用快速排序的最佳方式,但我需要知道它在这个问题上的最坏情况复杂性。只需将调用从
std::sort
更改为
std::partition
std::partition
保证精确地进行
n
键比较。最坏的情况是O(n2)与内容无关,但如果您知道数组仅由0和1组成,则平均为O(n log n),然后不要使用快速排序。一次分区传递就足够了。我知道这不是使用快速排序的最佳方式,但我需要知道它在这个问题上的最坏情况复杂性。只需将调用从
std::sort
更改为
std::partition
std::partition
保证精确的
n
键比较。但在本例中,您在数组中迭代了2次,一次用于计数,一次用于写入正确,但算法为O(n)。第二次遍历不执行键比较。但在本例中,您在数组中迭代了2次,一次用于计数,一次用于写入正确,但是算法是O(n),第二次传递不执行密钥比较。