算法分析:冒泡

求和

符号是\sum,一般用法是\sum_{1}^{100} i,表示1+...+100, \sum_{1}^{100} 2i表示 2*1 + ...... + 2*100

 

分析的维度

主要是有

  1. 比较次数(最坏情况,最好情况,平均情况)
  2. 交换次数(最坏,最好, 平均)
  3. 辅助空间(最坏,最好,平均)
  4. 为了方便,很多分析会把一次比较和一次交换看做耗时相同的一次操作。不过在算法执行过程中,交换次数总是少于(甚至远远少于)比较次数。所以有的分析方法只关注比较次数。

冒泡排序(选择排序)

第一趟排序要经历: 5,2比较; 2,3比较,2,3互换; 2,4比较,2,4互换; 2,1比较。

4次比较和2次互换。整个过程没有使用辅助空间。

 

经过总结可以得到:

对于长度为N数组,

第一趟排序,需要比较N-1次,在最优的情况下,需要互换0次;最坏的情况下需要互换N-1次

第二趟排序,需要比较N-2次,在最优的情况下,需要互换0次;最坏的情况下需要互换N-2次

最后一趟是第N-1趟,需要比较1次。最优情况,交换0次;最坏情况交换1次。

整个排序不需要辅助空间。

 

因此,一共需要比较\sum_{1}^{N-1}i次,最优的情况下,还需要交换0次‘;最坏的情况下,需要交换\sum_{1}^{N-1}i次。

因此冒泡排序的操作次数在\sum_{1}^{N-1}i2\sum_{1}^{N-1}i之间。

冒泡排序是O(n^2)的复杂度

 

冒泡排序平均操作次数

冒泡排序中,比较次数是固定的\sum_{1}^{N-1}i

平均交换次数则是 (最好 + 最坏 ) /2 

因此,冒泡排序的平均操作次数是  \frac{3}{2}\sum_{1}^{N-1}i

 

插入排序

public class InsertSort {

	private int[] data = {32, 23, 35, 1, 355, 2331, 87, 98, 800, 37, 32, 32, 37, 32, 37};

	public void sort() {
		int length = data.length;
		for (int i = 0; i < length; i++) {
			int j;
			for (j = i; j >0; j--) { // 插入元素
				if (data[j] < data[j-1]) { // 从右往左比较,交换
					int tmp = data[j];
					data[j] = data[j-1];
					data[j-1] = tmp;
				}
			}
		}
	}
	
	public void print() {
		System.out.println(Arrays.toString(data));
	}
	
	public static void main(String[] args) {
		InsertSort sort = new InsertSort();
		sort.sort();
		sort.print();
	}
}

分析

与冒泡排序是一样的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值