【データ構造学習記録26】-バブルとクイックソート

1.バブルソート

1.原則

クイックソートの前に、同様のアイデアであるバブルソート(またはバブルソート)を使用した単純なバージョンのソートを理解する必要があります。
バブルソートでは、私たちのアイデアは泡を吹いたり石を投げたりするのと似ています。後ろから前に、すべての要素がソートされるまで最小(最大)の値を前(または後ろ)に移動します。このシーケンスは整然とします。
バブルソートの時間計算量は次のとおりです。O(n 2)O(n ^ 2)O n2

2.ソートプロセス

ここに画像の説明を挿入
ここに画像の説明を挿入

3.コード

これは、最大の要素を最後まで「シンク」するコードの例です。

void BubbleSort(int arry[], int len)
{
    
    
    int i, j, temp;
    
    for (i = 0; i < len; ++i)   // 一共要排的个数
    {
    
    
        for (j = 0; j < len - i - 1; ++j)   // 从0开始到最后-1-i个元素
        {
    
    
            if (arry[j] > arry[j+1])    // 如果当前元素比后面元素大,则交换位置
            {
    
    
                temp = arry[j];
                arry[j] = arry[j+1];
                arry[j+1] = temp;
            }
        }
    }
}

2.クイックソート

1.原則

クイックソートは、再帰+バブルソートのアイデアを使用しています。プロセスは次のとおりです。

  1. まず、並べ替えるシーケンステーブルの開始と終了を低、高ポインターとしてマークし、[低、高]を選択して、位置の値をピボット(またはピボット)(ピボットキー)として使用します。
  2. 高い(高いを含む)から始めて、楽しみにして、ピボットよりも小さい(または大きい)値を探し、この値をピボットと交換します。
  3. 低(低を含む)から開始して逆方向に検索し、ピボット軸よりも小さい(または大きい)値を見つけて、この値をピボット軸と交換します。
  4. ピボット位置が最終位置になり、ピボットの左側がピボットより小さく、右側がピボットより大きくなるまでhigh==low2と3を繰り返しlow==highます。
  5. ピボットの左側と右側の2つの部品は再帰的に1234操作されます。最後に、配列を並べ替えることができます

2.ソートプロセス

ここに画像の説明を挿入
その後、我々は、新しいシーケンス1のソート再帰的に高速を実行します。
ここに画像の説明を挿入
このとき、元の配列となっています:
ここに画像の説明を挿入
それは再帰的な表現であるので、私たちの再帰的なスタックは、新しいシーケンス3のソートを開始する必要があります
ここに画像の説明を挿入
。この時点では、アレイのステータスは次のようになります
ここに画像の説明を挿入
と次に、新しいシーケンス5 。:
ここに画像の説明を挿入
配列の状態:
ここに画像の説明を挿入
次に、再帰スタックが新しいシーケンス4になります。
ここに画像の説明を挿入

ここに画像の説明を挿入
次に、新しいシーケンス6:
ここに画像の説明を挿入
ここに画像の説明を挿入
最後に、最初にスタックされた新しいシーケンス2に戻ります。
ここに画像の説明を挿入
ここに画像の説明を挿入
したがって、全体的なフローチャートは次のようになります。
ここに画像の説明を挿入

3.パフォーマンス分析

今のところ、導関数については説明しません。結論を覚えておいてください。Tavg(n)<(b 2 + 2 c)(n + 1)ln(n + 1)n≥2T_{avg}(n) <(\ frac {b} {2} + 2c)(n + 1)ln(n + 1)\ \\n≥2TVのグラムn <((2B+2 c n+1 l n n+1 n   2b c定数であるが、その後、私たちの時間計算量は次のとおりです。O(nlogn)桁違い。平均値と最高の時間の複雑さは、nlogある2nであり、最悪の場合の時間の複雑さはN2です。ログ:宇宙の複雑さをするように最適化することができる2n個。
ピボットの選択に他の方法を使用すると、最悪の場合の並べ替えのパフォーマンスを大幅に向上させることができます。
または、その一次划分時点で最適化すると、最悪の場合のパフォーマンスを改善することもできます。
ただし、ここでは説明しません。

4.コード

私は自分でコードを書くのが面倒です。1つコピーしてください。

#include <stdio.h>

void quickSort(int arr[], int low, int high)
{
    
    
    int first = low;
    int last  = high;
    int key = arr[first];
    if(low >= high)
        return;
    while(first < last)
    {
    
    
        while(first < last && arr[last] > key)
        {
    
    
            last--;
        }
        arr[first] = arr[last];

        while(first < last && arr[first] < key)
        {
    
    
            first++;
        }
        arr[last] = arr[first];
    }
    arr[first] = key;

    quickSort(arr, low, first-1);
    quickSort(arr, first+1, high);
}

int main()
{
    
    
    int i;
    int a[10] = {
    
    3, 1, 11, 5, 8, 2, 0, 9, 13, 81};

    for(i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");

    quickSort(a, 0, 9);

    for(i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

おすすめ

転載: blog.csdn.net/u011017694/article/details/111468516