冒泡排序+怎么计算时间复杂度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhou920786312/article/details/85616369

冒泡排序的基本思想

时间复杂度为O(N^2)

每次比较两个相邻元素,如果他们的顺序错误就把它们交换过来。

举个栗子

例如我们需要将 12,35,99,18,76,  5个数进行从大到小排序,既然是从大到小排序,也就是越小越靠后。
首先比较第一个数和第二个数,第一个是12,第二个是35,发现12 小于35,由于是越小越靠后,因此要对这两个数交换位置,那么交换后的顺序为 35,12,99,18,76。按照之前的方法,我们比较第二个和第三个数,第二个是12第三个是99,99大于12,所以要交换两个数的位置,交换过的顺序为 35,99,12,18,76。以此类推,可以通过下图来看12的位置变化:
12,35,99,18,76   初始数据
35,12,99,18,76   第1次交换
35,99,12,18,76   第2次交换
35,99,18,12,76   第3次交换
35,99,18,76,12   第4次交换 (5-1,假设要排序的个数为m,那么比较次数m-1,那么最糟糕情况下交互次数就是m-1)
进行4次交换后,就成功把最小的数12给排到最后面了。

现在我们已经将最小的数给归位了,现在对剩下的数再进行归位,细节我就不讲了,就将下重要的。

对剩下4个数进行排序:

99,18,76,35,12 (交换了3次,比较次数3)

对剩下3个数进行排序:

99,76,18,35,12  (比较了1次【99,76】,交换了1次【18,76】,比较次数2)

对剩下2个数进行排序:

99,76,18,35,12 (交换了0次,比较1次)

就如同一个气泡,一步步向上翻滚,最后成功浮出水面,所以他叫冒泡排序。

代码

	public static void main(String[] args) {
		//生成数据源
		//待排序个数
		int n=5;
		int src[]=new int[n];
		src[0]=12;
		src[1]=35;
		src[2]=99;
		src[3]=18;
		src[4]=76;
		//冒泡排序
		//遍历第一个到最后一个
		for (int i=0; i<n;i++) {//执行n次
			//比较剩余的数据
		 for (int j=0 ;j<n-i-1; j++) {//j<n-i-1 防止src[j+1]数组越界,执行n-1次
			if(src[j]<src[j+1]){
				int temp=src[j+1];//最差情况执行n-1次
				src[j+1]=src[j];//最差情况执行n-1次
				src[j]=temp;//最差情况执行n-1次
			}
		}
		}
		//打印排序
		for (int i=0; i<n;i++) {
			System.out.println(src[i]);//最差情况执行n次
		}
	}
//	 结果
//	99
//	76
//	35
//	18
//	12

}

为什么时间复杂度为O(N^2)

计算最糟糕情况

要排序的个数n

第一层for

执行了n次

第二层for

第一次比较了n-1次

第二次比较了n-2次

....

第n-1次比较了1次

执行的总次数

count=3(1+2+3+4+.....+n-1)(n为正整数)

打印for

执行了n次

所有总的次数:

sum=n+3(1+2+3+4+...+n-1)+n+(n-n)=3(1+2+3+4+...+n-1+n)-n

如果n为偶数

sum=3* n/2*(n+1) -n=3/2(n^2+n)-n=1/2(3n^2+n)

如果n为奇数

sum=3((n-1)/2 *n+(n+1)/2)-n=3/2(n^2+1)-n=1/2(3n^2-2n+3)

所以最差的情况的时间复杂度为O(N^2),最好的情况我就不推了,O(N)

猜你喜欢

转载自blog.csdn.net/zhou920786312/article/details/85616369