📌  相关文章
📜  用于对 0、1 和 2 的数组进行排序的 C++ 程序(1)

📅  最后修改于: 2023-12-03 14:56:20.470000             🧑  作者: Mango

用于对 0、1 和 2 的数组进行排序的 C++ 程序
介绍

这是一个用于对只包含 0、1 和 2 的数组进行排序的 C++ 程序。该排序算法可以将数组中的元素按照升序排列,其中 0 代表最小值,2 代表最大值。

算法思路

该排序算法采用了三向切分快速排序(Dutch National Flag algorithm)的变种。算法通过遍历数组的元素,并根据元素的值进行交换,最终将 0 放在数组的前部分,将 2 放在数组的后部分,中间部分则为 1。

算法步骤如下:

  1. 创建三个指针,分别为 low、mid 和 high,初始时 low 和 mid 都指向数组的起始位置,high 指向数组的末尾位置。

  2. 遍历数组,直到 mid 指针超过 high 指针:

    • 若 nums[mid] 为 0,则将其与 nums[low] 交换,同时将 low 和 mid 指针向后移动;
    • 若 nums[mid] 为 1,则将 mid 指针向后移动;
    • 若 nums[mid] 为 2,则将其与 nums[high] 交换,同时将 high 指针向前移动。
  3. 重复步骤 2 直到 mid 指针超过 high 指针。

示例代码

下面是用于对 0、1 和 2 的数组进行排序的 C++ 程序示例代码:

#include <iostream>
#include <vector>

void sortArray(std::vector<int>& nums) {
    int low = 0;
    int mid = 0;
    int high = nums.size() - 1;

    while (mid <= high) {
        if (nums[mid] == 0) {
            std::swap(nums[mid], nums[low]);
            low++;
            mid++;
        } else if (nums[mid] == 1) {
            mid++;
        } else {
            std::swap(nums[mid], nums[high]);
            high--;
        }
    }
}

int main() {
    std::vector<int> nums = {2, 0, 2, 1, 1, 0};
    sortArray(nums);

    std::cout << "Sorted Array: ";
    for (const auto& num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}
运行结果

程序运行结果如下:

Sorted Array: 0 0 1 1 2 2
总结

通过这个程序,我们可以对只包含 0、1 和 2 的数组进行排序,将数组中的元素按照升序排列。该排序算法的时间复杂度为 O(n),其中 n 为数组的长度。这个算法在解决某些特定问题时非常有用,例如荷兰国旗问题。