算法-冒泡排序

基本思想

冒泡排序就是把小的元素往前调或者把大的元素往后调,比较是相邻的两个元素比较,交换也发生在这两个元素之间。

冒泡排序是一种稳定排序算法。

实现原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1
2
3
4
5
6
7
8
9
10
11
void bubbleSort(vector<int>& nums) 
{
for (int i = 0; i < nums.size(); ++i)
{
for (int j = 0; j < nums.size() - 1 - i; ++j)
{
if (nums[j] > nums[j + 1])
swap(nums[j], nums[j + 1]);
}
}
}

冒泡优化

假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void bubbleSort(vector<int>& nums)
{
int n = nums.size();
bool flag = false;
for (int i = 0; i < n - 1; ++i)
{//i = 0 起,循环了n - 1趟,更符合规范理解
flag = false;
for (int j = 0; j < n - 1 - i; ++j)
{
if (nums[j] > nums[j + 1])
{
//某一趟排序中,只要发生一次元素交换,flag就从false变为了true
//也即表示这一趟排序还不能确定所剩待排序列是否已经有序,应继续下一趟循环
swap(nums[j], nums[j + 1]);
flag = true;
}
}
//但若某一趟中一次元素交换都没有,即依然为flag = false
//那么表明所剩待排序列已经有序
//不必再进行趟数比较,外层循环应该结束,跳出循环
if (!flag)
break;
}
}