作者简介:
🍀姓姜,字君竹。
🍁浅薄观点:科以载文,文以载道
🌱软件技术升计科,计划考研
🌾要有最朴素的生活和最遥远的梦想,即使明日,天寒地冻,路遥马亡
1.概念及介绍
冒泡排序是一种简单直观的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作就是重复地进行直到没有再需要交换,也就是该序列已经排序完成。这个算法的名字由来是因为岳晓的元素会经过交换慢慢“浮”到数列的顶端。
冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明改序列已经有序。但这种改进对于提升性能来说并没有太大作用。
2.时间空间复杂度
对于冒泡排序来说,最坏的情况就是元素是逆向有序的,此时需要执行n-1次,并且两两元素都需要交换,相当于最小的元素排在末尾,一路交换到第一位,然后是次最小的一直交换到第二位,此时的时间复杂度为O(n2);最好的情况就是元素正向有序,这时只需要执行一次排序来确认元素的顺序即可。此时内层循环执行一次,元素两两进行比较,一共需要进行n-1次,因为没法发生交换,算法提前结束,此时的时间复杂度为O(n)。正常情况下冒泡排序的时间复杂度为O(n2)。
冒泡排序在执行过程中只需要定义的几个临时变量,所以空间复杂度为常数级O(1)。
3.图解
- 代码实现
int main() { int a[] = { 2, 5, 4, 3, 7, 6, 8, 0, 1, 9 }; int i = 0; int sz = sizeof(a) / sizeof(a[0]); for (i = 0; i < sz; i++) { int change = 0; int j = 0; for (j = sz - 1; j > i; j--) { if (a[j] < a[j - 1]) { int tmp = a[j]; a[j] = a[j - 1]; a[j - 1] = tmp; change = 1; } } if (0 == change) { break; } } for (i = 0; i < sz; i++) { printf("%d ", a[i]); } return 0; }
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。