此为面经第七谈!可以关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
开始状态:
总:冒泡排序其实就是双循环的结果。外层循环控制要进行的遍历次数,内层循环用来比较相邻元素。
分:
最好时间复杂度就是(n)(只在外层循环遍历一次就排序完成)
最差时间复杂度就是(n²)
平均时间复杂度也是(n²)
空间复杂度:1(借用了temp临时变量)
稳定性:稳定。
冒泡排序算法的实现:
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
bool swapped;//用来表明是否交换
//外层循环控制遍历的次数
for (int i = 0; i < n - 1; i++) {
swapped = false;
// 内层循环:将最大的元素冒泡到未排序部分的末尾
for (int j = 0; j < n - i - 1; j++) {//n-i-1减去已经排好的末尾
if (arr[j] > arr[j + 1]) { // 从小到大排序
// 交换相邻元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 如果在某次遍历中没有发生交换,说明数组已排序完成
if (!swapped) break;
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);//调用bubbleSort
cout << "Sorted array: \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
return 0;
}
冒泡排序的过程可以用以下更简洁的语句描述:
- 开始:将数组看作一个未排序的序列。
- 比较相邻元素:从序列的开始,对每对相邻元素进行比较。
- 交换:如果发现元素顺序错误(左边的大于右边的),则交换它们。
- 移动:完成一轮遍历后,最大的元素会“冒泡”到序列的末尾。
- 重复:对剩余未排序的序列重复步骤2到4。
- 结束:当整个序列都被遍历且排序完成时,排序结束。
总:排序可视化网站(建议打开看着代码来了解)Comparison Sorting Visualization (usfca.edu)
看着排序过程来理解代码实现会更好。
冒泡排序的特点是每遍历一次,就能确保一个元素找到它的最终位置,算法简单直观,但效率相对较低。