1

私はバブルソートと挿入ソートとクイックソートをテストしたクラスで研究に取り組んでおり、乱数のテストを行いました。結果は、挿入ソートがバブル ソートよりも速く、クイック ソートが最も遅いことを示しています。

だから私は時間の面で以下のランキングを持っています

  1. 挿入ソート(最速)
  2. バブル ソート (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;
}
4

3 に答える 3

3

まあ、クイックソートは入力に大きく依存しています。クイックソートを行う前に、入力をシャッフルする必要があります。入力がソートされている場合、クイックソートは O(n2) の複雑さを持つ可能性があります

挿入ソートは、小さな配列の場合も高速になる可能性があります

于 2012-10-16T11:08:58.963 に答える
2

O(nlogn)は「より高速」ですO(n^2)が、大きな O 表記の意味を思い出してください。

これは、アルゴリズム A の複雑さがO(nlogn)、一部の定数N_1に対して 、およびc1の場合n>N、アルゴリズムは「高速」であり、 であることを意味しc1*n*log(n)ます。アルゴリズム B が を持っている場合、アルゴリズムが の場合よりも「高速」になるように、いくつかO(n^2)の定数 があります。N_2c2c2 * n^2 * log(n)n > N_2

しかし - この前に何が起こるのNでしょうか? この定数は何Cですか?我々は知りません。アルゴリズムは、小さな入力のBアルゴリズムよりも「高速」である可能性がありますAが、大きな入力の場合、実際にAは高速になります(漸近境界の方が優れています)。

たとえば、アルゴリズムがops でA実行され、アルゴリズムが で実行される場合を考えてみましょう。for - 私たちはそれを取得します(ceil for をツールします)、そして- したがって algorithmですが、この入力の場合よりも高速です。T_1(n) = 10* nlog(n)BT_2(n) = n^2n=3T_1(3) = 10*3*2 = 60log(n)T_2(3) = 9BO(n^2)A

クイック ソートと挿入ソートについて:
クイック ソートは通常非常に高速であり、非常にまれなケースで 2 次時間に減衰します (ピボットとしてランダムな要素を選択した場合、これが発生する確率はわずかです)。

ただし、クイックソートの大きな O 表記の背後にある定数は、挿入ソートよりも大きくなっています。したがって、可能な最適化は次のとおりです。特定のしきい値(たとえば、30要素)に達するまでクイックソートを使用し、クイックソートではなく挿入ソートでこの部分配列をソートします。この投稿では、この最適化について説明します。

バブル ソートは (経験的に) ランダムな配列ではひどいものですが、配列がほとんどソートされていて、「場違いな」要素が最初にある場合は良いかもしれません。

于 2012-10-16T11:29:46.200 に答える
2

配列のサイズによって異なります。小さな配列では、単純なアルゴリズム (挿入ソートなど) で十分に機能します。より優れたアルゴリズムは必要ありません。

ただし、n が大きい場合 (n=10000000 など)、クイックソートは通常、挿入 (またはバブル) ソートよりもはるかに優れています。

于 2012-10-16T11:12:09.947 に答える