思路: 两两比较相邻元素,如果反序则交换,直到没有反序为止。

框架:

#include <algorithm>
#include <iostream>
#include <vector>

void BubbleSort(std::vector<int>& A) {

}

int main() {
    std::vector<int> A{9, 1, 5, 8, 3, 7, 4, 6, 2};
    std::ranges::for_each(A, [](int value) { std::cout << value << ' '; });
    return 0;
}

循环 n - 1 次。n 是待排序数组内元素的个数。每一轮循环都至少将一个元素移动到正确位置,在进行 n - 1 轮排序后,排序必然完成(可能提前完成)。

void BubbleSort(std::vector<int> &A) {
    for (int i = 0; i < A.size() - 1; ++i) {
            
    }
}

内层循环从数组的末尾开始,向前遍历未排序的部分,到已排序的部分停止。数组的开头是已排序的部分。每一次内层循环结束,数组的开头就会多一个已排序的元素。已经排序好的元素不再参与比较。

void BubbleSort(std::vector<int> &A) {
    for (int i = 0; i < A.size() - 1; ++i) {
        for (int j = A.size() - 1; j > i; --j) {

        }
    }
}

在每次内层循环中,比较相邻元素的大小,如果当前元素比前一个元素小,就交换它们。这样,较小的元素会逐渐“冒泡”到左边,较大的元素则被交换到右边。
(交换相邻元素的值时使用已定义的函数void Swap(int&, int&);

void BubbleSort(std::vector<int> &A) {
    for (int i = 0; i < A.size() - 1; ++i) {
        for (int j = A.size() - 1; j > i; --j) {
            if (A[j] < A[j - 1]) {
                Swap(A[j], A[j - 1]);
            }
        }
    }
}

完整代码:

#include <algorithm>
#include <iostream>
#include <vector>

void Swap(int &i, int &j) {
    int temp = i;
    i = j;
    j = temp;
}

void BubbleSort(std::vector<int> &A) {
    for (int i = 0; i < A.size() - 1; ++i) {
        for (int j = A.size() - 1; j > i; --j) {
            if (A[j] < A[j - 1]) {
                Swap(A[j], A[j - 1]);
            }
        }
    }
}

int main() {
    std::vector<int> A{9, 1, 5, 8, 3, 7, 4, 6, 2};
    BubbleSort(A);
    std::ranges::for_each(A, [](int value) { std::cout << value << ' '; });
    return 0;
}

标签: 排序

添加新评论