🥰前言
🍔在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法,下面我们来看一看冒泡排序的特点与效率怎么样。😍
冒泡的由来
🍁简介:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
时间空间复杂度
✅时间复杂度: O()
✅空间复杂度: O(1)
🚨注意:这里的是以最坏的情况去算的
排序原理
🍪 原理:通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,如果发现顺序跟想要的不一样则交换这两个数据的位置,使值较大(或较小)的数据逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。
🥰原理图解:
✅正如图中我们看到的这样,把比前一个小的的数据,想泡泡一样慢慢的“浮出”
代码
🥝升序代码:
#include <stdio.h> //冒泡排序(升序) void Bobblesort(int* arr, int n) { assert(arr); int pos = 1;//为了提高效率,增加一个判断,假设整个数据已经有序 for (int i = 0; i < n; i++)//控制遍历的趟数 { for (int j = 0; j < n - i - 1; j++)//控制每一趟比较的次数 { if (arr[j] > arr[j + 1]) { pos = 0;//存在交换情况,则证明这组数据还有可能乱序,修改POS的值为假 int tmp = arr[j]; //设置中间变量tmp记录要交换的其中一个数据 arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (pos)//当数据已经有序则提前退出 break; } } //打印数据 void print(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } //测试函数正确性 int main() { int arr[10] = { 2,3,5,1,6,9,0,4,7,8 }; int sz = sizeof(arr) / sizeof(arr[0]); printf("排序前:"); print(arr, sz); Bobblesort(arr, sz); printf("排序后:"); print(arr, sz); return 0; }
✅运行结果:
🥝降序代码:
#include <stdio.h> //冒泡排序(降序) void Bobblesort(int* arr, int n) { assert(arr); int pos = 1;//为了提高效率,增加一个判断,假设整个数据已经有序 for (int i = 0; i < n; i++)//控制遍历的趟数 { for (int j = 0; j < n - i - 1; j++)//控制每一趟比较的次数 { if (arr[j] < arr[j + 1]) { pos = 0;//存在交换情况,则证明这组数据还有可能乱序,修改POS的值为假 int tmp = arr[j]; //设置中间变量tmp记录要交换的其中一个数据 arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (pos)//当数据已经有序则提前退出 break; } } //打印数据 void print(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } //测试函数正确性 int main() { int arr[10] = { 2,3,5,1,6,9,0,4,7,8 }; int sz = sizeof(arr) / sizeof(arr[0]); printf("排序前:"); print(arr, sz); Bobblesort(arr, sz); printf("排序后:"); print(arr, sz); return 0; }
✅运行结果: