原理
如果有n个元素,就找n-1次,每次冒泡出最大值
-
从头遍历,如果后一个元素大于当前元素,就交换
-
每次遍历完后最后一个元素就是最大值,长度减一,找剩余元素最大值,直到数量为2时
性能
时间复杂度:最坏和平均的是O(n^2),最好的是O(n)
空间复杂度:O(1),是原地排序算法
由于较高时间复杂度,不适合大规模数据的排序。实际开发中,常用更高效的排序算法(快排、堆排、归并、计数等)。
代码
1.0
输入:数组地址,数组长度
输出:升序排列的数组
bubble_sort.c
//传入数组地址,数组长度
void bubble_sort(int *arr, int len)
{
//排序
//i 表示查找的范围
//j 表示冒泡的起始位置
for (int i = len; i > 1; --i) {
for (int j = 0; j < i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
//比后一个元素大,交换值
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
2.0(迭代器版)
输入:数组第一个元素的地址,数组最后一个元素的下一个地址
输出:升序排列的数组
bubble_sort2.c
//传入数组首尾地址
void bubble_sort2(int *begin, int *end)
{
int len = 0;
int *start = begin;
for (; start != end; ++start) {
++len;
}
//排序
//i 表示查找的范围
//j 表示冒泡的起始位置
for (int i = len; i > 1; --i) {
for (int j = 0; j < i - 1; ++j) {
if (begin[j] > begin[j + 1]) {
//比后一个元素大,交换值
int tmp = begin[j];
begin[j] = begin[j + 1];
begin[j + 1] = tmp;
}
}
}
}
test_sort.c
#include <stdio.h>
void bubble_sort(int *arr, int len);
void bubble_sort2(int *begin, int *end);
//打印数组
void print_arr(int *begin, int *end)
{
int *start = begin;
for (; start != end; ++start) {
printf("%d ", *start);
}
printf("\n");
}
void test_bubble()
{
int arr[] = { 4, 3, 9, 2, 7, 8, 0, 1 };
int len = sizeof(arr) / sizeof(arr[0]);
/* bubble_sort(arr, len); */
bubble_sort2(arr, arr + len);
print_arr(arr, arr + len);
}
int main()
{
test_bubble();
return 0;
}