冒泡排序(Bubble sort)
- 思想:从左到右两两对比,大的往后移,每轮完成之后,数组中最大的数都会沉到数组末尾。
- 优缺点:稳定、不需要辅助和空间,但是效率太低
- 复杂度:
时间换空间,不需要额外的辅助空间
平均时间复杂度:O(n^2) 、 最好(已经有序的情况):O(n)、最差(正好倒序的情况):O(n^2) - 稳定性:稳定
源代码
/******************
题目:冒泡排序(从小到大)
两两对比,大数沉底
*******************/
#include<iostream>
using namespace std;
//参数:
// numbers[]:数组
// length:数组长度
void Bubble_Sort(int numbers[], int length)
{
//1. 判断传入参数是否有效
if (numbers == nullptr || length <= 0)
return;
int temp = -1; //临时变量
bool flag = true; //标记
//2. 外层循环代表轮次,每轮的结果都是,最大的数放在最后
for (int i = 0; i < length; i++)
{
//3. 内层循环两两对比,如果后面的数小于前面的数,交换
for (int j = 0; j < length - i - 1; j++)
{
//如果要从大到小排序,符号反过来就好,每轮最小的数沉底
if (numbers[j] > numbers[j + 1])
{
temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
//4. 如果有交换,则进行标记
flag = false;
}
}
//5. 判断标记是否被修改,如果没被修改说明数组已经有序,不用再进行下面几轮的冒泡了
if (flag)
break;
//6. 重置每一轮的标记
flag = true;
}
}
//简单测试
int main(int argc, char* argv[])
{
const int length = 7;
//int numbers[length] = { 3, 2, 7, 11, 9, 4, 2 }; //基本无序
//int numbers[length] = { 1, 2, 3, 4, 5, 6, 7 }; //完全有序
//部分有序(两轮冒泡之后,数组有序)
int numbers[length] = { 7, 8, 1, 2, 3, 4, 5 };
Bubble_Sort(numbers, length);
for (int i = 0; i < length; i++)
cout << numbers[i] << " ";
cout << endl;
return 0;
}
仍有不足,欢迎交流。