算法初步之—排序

恩,昨天弄了哈二分查找,先来回忆一下二分查找的重要的知识点

1.有序的数组才能使用二分查找

2.二分查找法的效率很高,2的对数来得到二分法的查找次数。

3.二分查找法的原理

      从一个有序数组中查找一个值,首先得到该数组的长度一半的(也就是得到该有序数组的中间值)的值,跟要查找的值进行比较,如果该值等于要查找的值,那么就结束了,如果该值大于要查找的值,那么我们的查找范围缩小,也就是说,这时我们要把我们查找的最大的的下标的值设置成为刚得到的下标。反之,我们则把最小的下标设置成为刚得到的下标值。按照这样的循环方式,最后查找到要查找的值,如果该数组中确实不存在该值,最后我们的最小下标会大于最大下标。此时查找就应该结束了。

核心代码如下:

while(true){ 
	current = (min + max)/2; 
	if(a[current] == searchKey){ 
		return current; 
	}else if(min>max){ 
		return nElems; 
	}else if(a[current] >searchKey){ 
		max = current-1; 
	}else if(a[current] <searchKey){ 
		min = current+1; 
	} 
}

  

 

上面说到的是二分查找法,二分查找法执行的一个前提是,有序数组,那么我们现在要说的就是怎么让一个数组变得有序起来—排序。

排序有多种,下面慢慢道来。

一:冒泡排序—最简单,但应该是最慢的排序

实现代码:

for(int out = a.length-1; out>1 ; out--){//排完一次,确定一个最大值,之后就少排一次
	for(int in = 0  ; in < out; in++){//循环比较内层,根据外层比较的长度变小,相应的内层比较次数变少
		if(a[in]>a[in+1]){
			int temp = a[in];
			a[in] = a[in+1];
			a[in+1] = temp;
		}
	}
}

 

从上面可以看到,如果是10个的数据的数组,他的比较次数应该是:9+8+7+……+1=45

也即:(N-1)+(N-2)+……+1=N*(N-1)/2。效率可想而知。

(未完待续)

 

你可能感兴趣的:(算法)