在编程中,排序是一个非常基础又重要的操作。而C++原地排序因其节省内存空间的特性,在实际开发中被广泛使用。本文将带你从零开始,深入浅出地理解什么是原地排序,并通过具体例子学习两种经典的原地排序算法:冒泡排序和快速排序。
原地排序(In-place Sorting)是指在排序过程中,除了输入数组本身外,只使用常数级别的额外空间(O(1) 空间复杂度)。这意味着排序直接在原始数组上进行,不需要创建新的数组来存储中间结果。
冒泡排序是最简单的原地排序算法之一。它通过重复遍历数组,比较相邻元素并交换位置,使得较大的元素像“气泡”一样逐渐“浮”到数组末尾。
#include <iostream>#include <vector>void bubbleSort(std::vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n - 1; ++i) { bool swapped = false; for (int j = 0; j < n - i - 1; ++j) { if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); swapped = true; } } // 如果某一轮没有发生交换,说明已经有序 if (!swapped) break; }}int main() { std::vector<int> nums = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(nums); for (int num : nums) { std::cout << num << " "; } return 0;} 冒泡排序的时间复杂度为 O(n²),虽然效率不高,但逻辑清晰,非常适合初学者理解排序的基本思想。
快速排序是实践中最常用的快速排序C++实现之一,它采用“分治法”策略,平均时间复杂度为 O(n log n),且是典型的原地排序算法。
#include <iostream>#include <vector>int partition(std::vector<int>& arr, int low, int high) { int pivot = arr[high]; // 选择最后一个元素作为基准 int i = low - 1; // 小于基准的区域的索引 for (int j = low; j < high; ++j) { if (arr[j] <= pivot) { ++i; std::swap(arr[i], arr[j]); } } std::swap(arr[i + 1], arr[high]); return i + 1;}void quickSort(std::vector<int>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); // 排序左半部分 quickSort(arr, pi + 1, high); // 排序右半部分 }}int main() { std::vector<int> nums = {10, 7, 8, 9, 1, 5}; quickSort(nums, 0, nums.size() - 1); for (int num : nums) { std::cout << num << " "; } return 0;} 快速排序虽然最坏情况时间复杂度为 O(n²),但在大多数实际场景中表现优异,是 C++ 标准库 std::sort 的底层实现之一。
通过本教程,你已经掌握了两种经典的C++原地排序方法:简单直观的冒泡排序和高效实用的快速排序。无论你是面试准备还是项目开发,理解这些基础算法都将为你打下坚实的基础。
记住,原地排序的核心在于不使用额外数组,只用少量变量完成排序。希望你能动手实践上面的代码,加深理解!
关键词回顾:C++原地排序、原地排序算法、快速排序C++、冒泡排序C++。
本文由主机测评网于2025-12-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126905.html