冒泡排序算法介绍
在计算机科学中,冒泡排序算法(Bubble Sort,台湾译作:泡沫排序或气泡排序)是一种简单的排序算法,它重复地遍历待排序的元素,每次比较相邻的两个元素,如果顺序错误就交换它们的位置,直到没有任何一对元素需要交换位置,排序完成。
冒泡排序算法的实现方式有多种,但本文以最基础的方法进行介绍。
冒泡排序算法代码
下面是冒泡排序算法的C++实现代码:
void BubbleSort(int arr[], int n){
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < n - 1 - i; j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
代码解析
现在我们来逐一解析上述代码:
void BubbleSort(int arr[], int n)
这是一个函数声明,其函数名为BubbleSort,接受两个参数:一个是待排序的数组arr,另一个是数组长度n,函数的返回值为void。
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < n - 1 - i; j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
这是冒泡排序算法的核心部分,其中包含两层循环,外层循环控制比较的轮数,内层循环则控制单轮比较的次数。
首先,我们暂且不去讨论轮数与次数的关系,先看内部的条件判断语句:
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
这个if语句指的是:如果数组中第j个元素大于第j+1个元素,则交换这两个元素的位置。这里交换是通过中间量temp实现的。
当然,最后的排序结果是将小的元素逐渐“冒泡”到最前面,而大的元素不断被“沉底”。下面我们再来讲讲轮数与次数的关系:
1. 外层循环控制比较的轮数,每一轮比较完毕后,都会将当前轮数加1。
2. 内层循环的结束条件是:j < n - 1 - i。显然,第一轮比较一次之后,最大的元素就已经沉底了,也就是说,每轮比较都可以少一次,所以,内层的循环次数应该是依次递减的。
因此,可以得出完整的排序时间复杂度为:O(n^2)。
代码应用
下面这个例子展示了如何将冒泡排序算法应用到实际问题中。
假设一个公司要对员工的薪资进行排序,那么我们就可以使用冒泡排序算法对薪资数据进行降序排列,找出公司内的高工资员工。
#include <iostream>
using namespace std;
void BubbleSort(int arr[], int n);
int main(){
int salary[] = {2000, 8000, 5000, 3000, 10000, 4000};
int num = sizeof(salary) / sizeof(int);
BubbleSort(salary, num);
for (int i = 0; i < num; i++){
cout << salary[i] << " ";
}
cout << endl;
return 0;
}
void BubbleSort(int arr[], int n){
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < n - 1 - i; j++){
if (arr[j] < arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
解析:
上述代码中,我们首先定义了一个存储员工薪资的数组salary,并读取该数组的大小,接着调用了冒泡排序函数BubbleSort,将salary传入。排序之后,再遍历输出薪资数组中的元素,也就是按照降序排列的员工薪资。
执行上述也代码,输出结果为:10,000 8,000 5,000 4,000 3,000 2,000。
总结
冒泡排序算法虽然简单,但其时间复杂度确实相当高的,尤其是对于较大的数据量,算法执行时间会变得非常缓慢,因此在实际开发中,并不常使用冒泡排序算法。但如果希望学习算法的基础知识,冒泡排序算法是一个挺不错的例子。