【データ構造とアルゴリズム】バブルソート

バブルソート:

時間の複雑さ:O(n ^ 2)
スペースの複雑さ:O(1)

テスト:
10,000個の乱数で並べ替え:速度が上がっているか下がっていることがわかります。

冒泡排序      : 	0.411331 s
冒泡排序优化1  : 	0.428745 s
冒泡排序优化2  : 	0.416507 s

順序付けられた数値のソートに近い10k:最適化されたバージョンの方が速いことがわかります。

冒泡排序       :       0.115256 s
冒泡排序优化1   :       0.000819 s
冒泡排序优化2   :       0.000736 s

基本的な考え方:
2つずつ比較します。現在位置の要素が次の要素と比較され、大きな要素が後ろに配置され、小さな要素が前に配置されます。
比較のラウンドが完了すると、最後の要素が最大の要素になります。

void sort1(int arr[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

最適化1:
いくつかのソートの、配列はすでに整然としている可能性があります。
この時点で、別のサイクルを実行しますが、交換は行われず、すでに正常であることを示しています。

void sort2(int arr[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        bool is_order = true;  // 假设已经有序
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                is_order = false;  // 发生元素交换,可能还是无序
                swap(arr[j], arr[j + 1]);
            }
        }
        if (is_order) {  // 如果有序就退出
            break;
        }
    }
}

最適化2:
ソート間隔の決定。
3 2 1 0 7 8 9の場合、1サイクル後、2 1 0 3 7 8 9になり、最後に交換される位置は順序付けされていない間隔になります。
各ラウンドの最後の交換ポジションを記録するだけです。

void sort3(int arr[], int n) {
    int sort_end = n - 1;
    int last_exchange = 0;
    for (int i = 0; i < n - 1; ++i) {
        bool is_order = true;
        for (int j = 0; j < sort_end; ++j) {
            if (arr[j] > arr[j + 1]) {
                is_order = false;
                last_exchange = j;
                swap(arr[j], arr[j + 1]);
            }
        }
        if (is_order) {
            break;
        }
        sort_end = last_exchange;
    }
}

EOF

98件のオリジナル記事が公開されました 91件の賞賛 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/Hanoi_ahoj/article/details/105472834