https://leetcode-cn.com/problems/sort-an-array/
每一轮(size-1轮)遍历比较相邻元素,当一个元素大于右边元素时,交换它们的位置,这样每一轮都将一个最大元素冒泡到数组中的最右端。
- 时间复杂度 O(n2)
- 优化
- 数组左部分元素都小于右边元素,经过n(n<size-1)后,整个数组已经有序了
- 如果在一轮冒泡中元素没有发生交换,break
- 右边元素有序,前几轮冒泡无用
- 每一轮交换后,记下最后一次元素交换的位置,该位置为无序数组的边界。
// 模板class Solution {public:vector<int> sortArray(vector<int>& nums) {// 外部循环控制遍历的轮数for (int i = nums.size() - 1; i > 0; i--) { // i的右边已经有序for (int j = 0; j < i; j++) {// 内部循环实现每一轮的冒泡if (nums[j] > nums[j+1]) swap(nums[j], nums[j+1]);}}return nums;}};
// 优化 class Solution { public: vector<int> sortArray(vector<int>& nums) { // 外部循环控制遍历的轮数 int sortBoard = nums.size() - 1; // 优化2 for (int i = nums.size() - 1; i > 0; i--) { // 内部循环实现每一轮的冒泡 i = sortBoard; bool isSorted = true; // 优化1 for (int j = 0; j < i; j++) { if (nums[j] > nums[j+1]) swap(nums[j], nums[j+1]); isSorted = false; sortBoard = j; // 不断更新边界的位置 } if (isSorted) break; } return nums; } };
- 每一轮交换后,记下最后一次元素交换的位置,该位置为无序数组的边界。
- 数组左部分元素都小于右边元素,经过n(n<size-1)后,整个数组已经有序了
