插入排序vs冒泡排序vs快速排序算法

时间:2012-10-16 11:06:50

标签: objective-c algorithm sorting quicksort bubble-sort

我正在课堂上进行研究 我测试了冒泡排序和插入排序以及快速排序,我对随机数进行了测试。 结果显示插入排序比冒泡排序更快,快速排序是最慢的排序。

所以我在时间方面有以下排名

  1. 插入排序(最快)
  2. 冒泡排序(第二次得分)
  3. 快速排序(最慢)
  4. 考虑到插入和冒泡排序具有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;
    }
    

3 个答案:

答案 0 :(得分:3)

好吧,快速排序很大程度上依赖于输入。在make quicksort之前你需要SHUFFLE输入。 如果您的输入已排序,则quicksort的复杂度可能为O(n2)

对于小型数组,

插入排序也可以更快

答案 1 :(得分:2)

这取决于数组大小。在小数组上,简单的算法(例如插入排序)可以很好地完成,不需要更好的算法。

但是,当n很大(比如n = 10000000)时,quicksort通常比插入(或冒泡)排序要好得多。

答案 2 :(得分:2)

O(nlogn)O(n^2)“更快”,但让我们回想一下大O符号的含义。

这意味着如果算法A的复杂度为O(nlogn),对于某些常量N_1c1,对于每个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会更快(渐近界限是更好)。

例如,我们假设算法AA操作中运行,而算法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讨论了此优化问题。

对于随机数组,冒泡排序(经验上)很糟糕,但如果数组几乎已经排序并且“不合适”元素位于其开头,则可能会很好。