冒泡排序基本思想及其复杂度分析

/*
* 冒泡排序:(稳定算法)
* 基本思想:冒泡排序属于比较简单的排序,以非递减为例,依次遍历数组,发现a[i]>a[i+1}的情况,swap(a[i],a[i+1])
* 直到没有逆序的数据,完成排序
* 可以用两个for循环嵌套实现,外层控制遍历次数,内层用来实现交换

* 也可以用一个boolean类型变量来控制是否有交换发生,如果没有交换,表明已经正序,可以直接输出

* 复杂度 分析:
* 很明显,冒泡排序最好情况是数组已经有序的情况,此时只需要遍历一次数据,没有交换发生,结束排序,时间复杂度为O(n)
* 那最坏情况下的冒泡就是逆序,此时你需要遍历n-1次数据,(数据为 3  2   1,一次遍历为2 1 3 ,二次遍历 1 2 3 结束  ),
* 此时的时间复杂度为O(n^2) 
* 平均情况下也为O(n^2) 需要注意的是平均情况并不是与最坏情况下的时间复杂度相等,
* 平均的时间复杂度=sum(Pi*f(n));Pi为每种情况出现的概率,计算起来有些困难,在这里直接用前辈的结果
* 空间复杂度:只需要一个temp临时变量来交换数据,所以O(1)


* Ps:冒泡排序在数组基本有序,只有零星逆序的情况下效率极高
*/

public static void bubbleSort1(int[] a){
		for (int k = 1; k < a.length ; k++) {
			for (int i = 0; i < a.length - k; ++i) {
				if (a[i] > a[i + 1]) {
					int temp = a[i];
					a[i] = a[i + 1];
					a[i + 1] = temp;
				}
			}
		}
	
		
	}
	
	public static void bubbleSort2(int[] a) {
		boolean bol = true;
		while (bol) {
			bol = false;
			for (int i = 0; i < a.length - 1; ++i) {
				if (a[i] > a[i + 1]) {
					int temp = a[i];
					a[i] = a[i + 1];
					a[i + 1] = temp;
					bol = true;
				}
			}
		}

	}



 

 

 

Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正

你可能感兴趣的:(基础知识)