本篇内容包含
冒泡排序的介绍冒泡排序的C的实现冒泡排序的java的实现冒泡排序的时间复杂度的计算冒泡排序从文字上理解不明思议就是河塘里的水,从地上冒泡上来到水面,下面有两张图很贴切的说明冒泡排序
这张图就是将数字12,35,99,18,76竖起来,然后从底部有一个气泡,圈住第一个数,然后自己上面的一个数对比,如果比上面小就交换,最后能将最小数12换到第一个数上,然后再经过同样的操作,从底部的气泡开始,到12之前的数结束,可以将18交换到12的前面
这张图模拟了冒泡排序的整个过程,数字横着放,第一个红色框表示气泡,两个红色框表示比较大小,而黑色框表示已经排好的数字,最后排成有序的数字
这里加了一个flag作为优化程序的条件,如果程序未进入内循环,说明数字已经排序好了,这个时候就可以退出外循环,直接程序结束,减少了剩余部分排序的循环
#include<stdio.h>void bubbleSort(int arr[],int n){ int i,j,flag; for (i = 1; i < n; i++) { flag = 0; for (j = 0; j < n-i; j++) { if(arr[j]<arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag =1; } } if(flag == 0)break; }}void main(){ int i; int arr[10] = {1, 4, 8, 3, 2, 9, 5, 0, 7, 6}; bubbleSort(arr, 10); for(i=0; i<10; i++){ PRintf("%d,", arr[i]); }}我们从代码分析,可以知道有两个循环
外循环:执行(n-1)次,当最坏的情况下,会执行n次,虽然最后一次(i < n)不通过,但还是算一次,其中里面有一条赋值语句内循环:在(i=1,2,3…n-1),执行(n-i)次,即(n-1,n-2…1),其中有四条赋值语句那么就可以计算出各自复杂度
外循环:最坏情况下是(1 x n)次内循环:通过等差数列求和公式,(n-1+n-2+…1)=n^2/2根据推导大O阶规则来进行推导
用常数1来取代运行时间中所有加法常数修改后的运行次数函数中,只保留最高阶项 如果最高阶项存在且不是1,则去除与这个项相乘的常数得到的冒泡排序的复杂度的大O表示法为
(1xn)+(n^2/2) ≈ n^2 = O(n^2)
新闻热点
疑难解答