冒泡排序
在 信奥基础之初识算法 这篇文章中我们给出了一个冒泡排序的代码示例,
冒泡排序是最基础最好理解的一个排序算法。
既然叫冒泡排序,那我们首先得搞清楚这个冒泡的泡从哪儿来?
先看一张网络上搞来的图片:
上面的图是将一个一维数组通过冒泡排序的方式进行排序的过程(来自网络)。
用文字来说明一下(两两比较,大的放后面):
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序比较简单,看完上面的过程应该大部分同学都能理解。
在这里顺便提下排序算法的稳定性。
我们讲某一个排序算法是否稳定,可以简单理解为这个算法排序后的数据是否唯一,这个唯一并不是说 {3,2,4,4,5} 排序后的结果一直是 {2,3,4,4,5}就行, 而是说排序后的结果中红色的4和蓝色的4的位置不能变。
另外,我们一般用复杂度来评价一个算法的好坏。这个等我们的C++基础讲完了再统一聊。代码仍然放下面,这次我加上了注释。具体的代码讲解也得等C++基础全部聊完后。
#include <iostream>
using namespace std;
/**
* 定义一个冒泡排序的函数,传入数组的数组的长度
**/
void bubbleSort(int arr[], int n)
{
for (int i = 0; i < n - 1; i++) // 循环外层从第一位开始,控制比较次数
{
for (int j = 0; j < n - i - 1; j++) // 循环内层从第一位开始
{
if (arr[j] > arr[j + 1]) // 每两个进行比较
{
swap(arr[j], arr[j + 1]); // 交换作比较的数组两个位置的值,这里调用的swap是C++提供的函数
}
}
}
}
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 要排序的一维数组
int n = sizeof(arr) / sizeof(arr[0]); // 获取数组的长度,sizeof用来获取当前对象在内存中占用的大小
cout << "排序前的数组为: ";
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
bubbleSort(arr, n); // 调用排序函数
cout << "\n 排序后的数组为: ";
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
return 0;
}