目录
作者想说
介于网上的排序算法文章大多都是死板的文字,本人文字理解能力一直不强。决定花时间做图解,把困难的问题变简单,把抽象的思维变具体。给想学习程序的小伙伴更好理解的文章资源。
文学家的浪漫是把一切用文字来书写,程序员的浪漫是把我们心中所想用代码书写
这里我将用图解来书写,程序在我脑子里的样子,我叫@张三xy,致力于写出优质作品的编程爱好者
1.冒泡排序简介
1.1.什么是冒泡排序
冒泡排序(Bubble Sort),是计算机科学与技术领域中较为简单的一种排序算法。
它重复地遍历要排序的序列,会依次比较两个相邻的元素,如果发现两个相邻的元素顺序错误就把它们交换过来。遍历序列的工作会重复地进行直到没有相邻的元素需要交换位置,也就是说序列的排序工作已经完成。
1.2.冒泡排序的名称由来
冒泡排序的算法名称的由来就是因为在排序的过程中,按照排序规则(升序或者降序),越小或者越大的元素会经过交换之后慢慢 “浮” 到序列的顶端,就如同水中的气泡一样最终会浮到顶端一样,所以起名为 “冒泡排序”。
2.冒泡排序的实现过程
2.1.原理图解
2.1.1.冒泡执行模拟第一轮图解
第一轮我们 j 指向 3下标时,就不会往后移动了
因为 j + 1刚好包含到了最后一个下标 4
因此我们第一轮最多遍历到 下标最大值 - 1
每轮排序后 这轮的最后一个值,一定是有序,下轮就不用管了
2.1.2.冒泡执行模拟第二轮图解
第二轮我们 j 指向 2下标时,就不会往后移动了
因为每轮排序后 这轮的最后一个值,一定是有序
因此第二轮的比较次数 下标最大值 - 1 - [已经排好的个数],前面累计1个
2.1.3.冒泡执行模拟第三轮图解
第三轮我们 j 指向 1下标时,就不会往后移动了
因为每轮排序后 这轮的最后一个值,一定是有序
因此第三轮的比较次数 下标最大值 - 1 - [已经排好的个数],前面累计2个
2.2思考问题
2.2.1.我们会不会有第四轮?
答:一定有,会根据数据量,排序次数以n^2的程度上涨
2.2.2.如果第一轮就排序完成还会继续执行吗?
答:一定会,,会从 n - 1 ~ 0次,时间复杂度是O(n^2)
2.2.3.如何在程序中优化这个问题?
答:如果排序在某一轮中,一次没有进入交换条件里我们就知道它全部排序完成。
所以可以做个标记,如果一次没有进入交换条件,我们就终止这个程序。(优化思路)
2.3代码实现
2.3.1.定义数组并传入我们的冒泡排序函数
n表示数组长度
int main() {
//自定义一个数组演示
int n = 5;
int a[] = {3,2,5,1,4};
//传入我们的冒泡排序函数
bubbleSort(a,n);
}
2.3.2.冒泡排序函数的实现
/**
* 冒泡排序函数
* @param a
* @param len 数组长度
* 时间复杂度:O(n^2)
*/
void bubbleSort(int a[],int len)
{
int flag;
for (int i = 0; i < len ; ++i)
{
flag = 1;//标记
// 这里 -1是因为最后一个不需要比较
//-i是因为,每轮最后一个值一定是有序的!
for (int j = 0; j < len - i - 1; ++j)
{
if(a[j] > a[j+1])
{
flag = 0;//进入说明没有完成排序
int tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
}
}
if(flag)break;//如果一次 比较没有进入说明已经完成排序
}
}
以上就是我们 冒泡排序 的全部内容了,
走过路过的小伙伴们点点关注三连支持一下吧!
你们的支持就是我创作内容的最大动力!