思路:遍历要排序的序列中的每一条记录,让每一条记录的关键字和它后面的每一条记录的关键字两两比较,如果大于,则两条记录交换。在第一次遍历结束后,序列第一个位置处的记录的关键字会变成最小的。在每一次遍历结束后,被遍历位置处的记录跟它右侧的记录相比,它的关键字都是最小的。

框架:

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

void Sort(std::vector<int>& values) {

}

int main() {
    std::vector<int> values{1, 3, 2, 6, 4, 5};

    std::ranges::for_each(values, [](int value){std::cout << value << ' ';});

    return 0;
}

遍历数组 values 中的每一个元素。

void Sort(std::vector<int>& values) {
    for (int i = 0; i < values.size(); ++i) {

    }

}

对于每一个元素,与它后面的每一个元素两两比较,如果大于,则交换两个元素的位置。交换两个元素的位置使用已定义的函数void Swap(values, i, j);

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

定义函数void Swap(values, i, j);,交换索引 i 和 j 处两个元素的位置。

void Swap(std::vector<int>& values, int i, int j) {
    int temp = values[i];
    values[i] = values[j];
    values[j] = temp;
}

完整代码:

/*
 * 从头写一个简单的交换排序
 * */
#include <algorithm>
#include <iostream>
#include <vector>

void Swap(std::vector<int> &values, int i, int j) {
    int temp = values[i];
    values[i] = values[j];
    values[j] = temp;
}

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

int main() {
    std::vector<int> values{1, 3, 2, 6, 4, 5};

    Sort(values);

    std::ranges::for_each(values, [](int value) { std::cout << value << ' '; });

    return 0;
}

标签: 排序

添加新评论