插入排序VS冒泡排序VS快速排序算法(insertion sort vs bubble sort v

2019-08-01 13:13发布

我工作在I类测试冒泡排序和插入排序和快速排序的一个研究,我做了随机数的测试。 结果表明:插入排序比冒泡排序和快速排序更多更快是最慢的一个。

所以,我在时间上的排名如下

  1. 插入排序(最快)
  2. 冒泡排序(第二得分)
  3. 快速排序(最慢)

考虑到插入和冒泡排序有一个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;
}

Answer 1:

O(nlogn)是“快”,然后O(n^2)但是让我们来回顾一下大O符号的意思。

这意味着,如果算法A具有的复杂性O(nlogn)对于一些常量N_1 ,和c1 ,对于每个n>N -算法是“更快”然后c1*n*log(n) 如果算法B具有O(n^2)也有一些常量N_2c2 ,使得该算法是“更快”然后c2 * n^2 * log(n)n > N_2

但是-这是什么之前发生N ? 什么是这个常数C ? 我们不知道。 算法B可能仍然是“快”,那么算法A对小投入 ,但对于大的投入-事实上, A会更快(渐近界是更好)。

例如,让其中算法的采取的情况下A运行在T_1(n) = 10* nlog(n) OPS,而算法B在运行T_2(n) = n^2 。 对n=3 -我们得到T_1(3) = 10*3*2 = 60 (我们工具的小区对log(n)T_2(3) = 9 -因而算法B ,虽然O(n^2)更快然后A此输入。

关于快速排序和插入排序:
快速排序通常是非常快,并衰变为二次一次在极少数情况下(这种情况发生的概率是微乎其微的,如果我们选择一个随机元素作为支点)。

然而,在快速排序的大O符号背后的常数大于插入排序。 因此- 一个可能的优化是:使用快速排序,直到你达到一定的阈值 (比如30元),然后排序而不是快速排序排序此子阵的插入。 这篇文章讨论了这种优化。

冒泡排序是(经验),可怕的随机排列,但可能是一件好事,如果阵列几乎是排序和“出位”元素是它的开始。



Answer 2:

好,快速排序取决于输入巨资。 你需要化妆的快速排序前洗牌输入。 如果你的输入进行排序,快速排序可以具有复杂度O(N2)

插入排序也可以是小数组更快



Answer 3:

这取决于数组的大小。 在小数组简单的算法(如插入排序)会做很好,没有必要进行更好的算法。

然而,当n为大(比如N = 10000000),快速排序通常做得比插入(或气泡)的排序多好得多。



文章来源: insertion sort vs bubble sort vs quicksort algorithm