我正在课堂上进行研究 我测试了冒泡排序和插入排序以及快速排序,我对随机数进行了测试。 结果显示插入排序比冒泡排序更快,快速排序是最慢的排序。
所以我在时间方面有以下排名
考虑到插入和冒泡排序具有O(n2)的复杂度 快速排序O(n log n)和O(n log n)应该更快!!!
有人可以与我分享解释吗?
由于
(NSMutableArray *)quickSort:(NSMutableArray *)a
{
// Log the contents of the incoming array
NSLog(@"%@", a);
// Create two temporary storage lists
NSMutableArray *listOne = [[[NSMutableArray alloc]
initWithCapacity:[a count]] autorelease];
NSMutableArray *listTwo = [[[NSMutableArray alloc]
initWithCapacity:[a count]] autorelease];
int pivot = 4;
// Divide the incoming array at the pivot
for (int i = 0; i < [a count]; i++)
{
if ([[a objectAtIndex:i] intValue] < pivot)
{
[listOne addObject:[a objectAtIndex:i]];
}
else if ([[a objectAtIndex:i] intValue] > pivot)
{
[listTwo addObject:[a objectAtIndex:i]];
}
}
// Sort each of the lesser and greater lists using a bubble sort
listOne = [self bubbleSort:listOne];
listTwo = [self bubbleSort:listTwo];
// Merge pivot onto lesser list
listOne addObject:[[NSNumber alloc] initWithInt:pivot]];
// Merge greater list onto lesser list
for (int i = 0; i < [listTwo count]; i++)
{
[listOne addObject:[listTwo objectAtIndex:i]];
}
// Log the contents of the outgoing array
NSLog(@"%@", listOne);
// Return array
return listOne;
}
答案 0 :(得分:3)
插入排序也可以更快
答案 1 :(得分:2)
这取决于数组大小。在小数组上,简单的算法(例如插入排序)可以很好地完成,不需要更好的算法。
但是,当n很大(比如n = 10000000)时,quicksort通常比插入(或冒泡)排序要好得多。
答案 2 :(得分:2)
O(nlogn)
比O(n^2)
“更快”,但让我们回想一下大O符号的含义。
这意味着如果算法A的复杂度为O(nlogn)
,对于某些常量N_1
和c1
,对于每个n>N
,算法“更快”,然后{ {1}}。如果算法B具有c1*n*log(n)
,则存在一些常量O(n^2)
,N_2
,使得算法比c2
的“{更快”更快,然后c2 * n^2 * log(n)
。
然而 - 在n > N_2
之前会发生什么?什么是常数N
?我们不知道。 算法C
对于小输入仍然可以比算法B
“更快”,但对于大输入 - 实际上,A
会更快(渐近界限是更好)。
例如,我们假设算法A
在A
操作中运行,而算法T_1(n) = 10* nlog(n)
在B
中运行。对于T_2(n) = n^2
- 我们得到n=3
(我们使用T_1(3) = 10*3*2 = 60
的ceil)和log(n)
- 因此算法T_2(3) = 9
,尽管B
是比此输入快O(n^2)
。
关于快速排序和插入排序:
快速排序通常非常快,并且在非常罕见的情况下衰减到二次时间(如果我们选择随机元素作为支点,则发生这种情况的可能性很小。)
然而,快速排序中大O符号背后的常量大于插入排序。因此 - 可能的优化是:使用快速排序直到达到某个阈值(比如30个元素),然后使用插入排序而不是快速排序对此子阵列进行排序。 This post讨论了此优化问题。
对于随机数组,冒泡排序(经验上)很糟糕,但如果数组几乎已经排序并且“不合适”元素位于其开头,则可能会很好。