- 算法思想:从后往前(或从前往后)两两比较相邻的元素,若逆序,则交换位置,知道比较完成,为一趟冒泡排序。最多n-1趟排序过程;每趟的比较过程会使一个元素移动到最终位置,已经确定最终位置的元素不需要再次对比;如果某一趟排序过程未发生交换,则算法可以提前结束
- 空间复杂度:O(1)
- 时间复杂度:
- 最好:O(n)
- 最差:O(n^2)
- 平均:O(n^2)
- 稳定
- 顺序表和链表都可以
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//冒泡排序
void bubbleSort(int arr[], int len)
{
int i, j, temp;
for (i = 0; i < len - 1; i++)//前边已经排好序的元素开始
{
bool flag = false;//表示本趟冒泡是否发生交换的标志
for (j = len - 1; j > i; j--)//从数组的最后元素开始的一趟冒泡过程
{
if (arr[j - 1] > arr[j])//若为逆序
{
temp = arr[j - 1];//交换操作
arr[j - 1] = arr[j];
arr[j] = temp;
flag = true;
}
if (flag == false)
{
return;//本趟遍历后没有发生交换,说明表已经有序
}
}
}
}
冒泡排序
//void bubbleSort(int arr[], int len)
//{
// for (int i = 0; i < len - 1; i++) //比较的轮数 数组的长度 - 1
// {
// for (int j = 0; j < len - 1 - i; j++) //每个元素比较的次数
// {
// if (arr[j] > arr[j + 1])
// {
// //交换元素
// arr[j] = arr[j] ^ arr[j + 1];
// arr[j + 1] = arr[j] ^ arr[j + 1];
// arr[j] = arr[j] ^ arr[j + 1];
// }
// }
// }
//}
void test()
{
int arr[] = { 7,9,76,98,37 };
int len = sizeof(arr) / sizeof(int);
bubbleSort2(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d\n", arr[i]);
}
}
void main()
{
test();
}