算法基础(一)——冒泡,简单选择排序,二分查找

          做为数学专业的我,其实一直特别喜欢数学,只不过大学的数学课程让我有点失望,所以选择了专心学习另一个行业计算机,但是随着学习的不断深入,感觉到了数学魅力,数学可以运用到几乎所有的行业,它无处不在,在计算机中一个看似复杂的问题,其实在数学中也平凡不过。去年参加软考中设计了算法,因为当时时间比较紧,而且为了应付考试,所以算法学习的不够深入,仅仅是理论上的理解,还没有真正的运用到代码上边,更或者,还不知道如何在软件运用中让它发挥它的威力。但是基础总是要打的,从今天开始,利用业余时间学习学习算法,希望自己能坚持下去!


    这里先看看我的以前的一篇关于数据结构的总括博客:软考(1)——看图心想数据结构

          当然了,最开始这篇关于算法的博客,还是从最基础,最常用的几种算法入手,虽然比较简单,但是确实我们必须需要掌握的。简单看一下冒泡排序,简单选择排序,二分查找三种基础算法。

 

          一,冒泡排序,看到这种算法,我就想起一句话“小数上浮,大数下沉”,通过层层的比较使小数浮出水面,而使大数“石沉水底”。从而达到排序的效果。具体原理不再阐述,看代码看注释:

	/**
	 * 冒泡排序的java小例子
	 * @author Administrator
	 */
	public class BubberSort {
		public static void main(String[] args) {
			// 给定要排序的数组
			int[] a = { 3, 1, 6, 5, 2,9,7 };
	
			// 开始排序,冒泡排序遵循小数上浮,大数下沉的思想
			// 循环变量取出数组最后一个数a[i],依次进行循环
			for (int i = a.length - 1; i > 0; i--) {
				// 取出a[i]前边的数,和a[i]进行比较
				for (int j = 0; j < i; j++) {
					// 如果a[j]大于a[j+1],则进行交换数据,小数向上浮动,达到冒泡的效果
					if (a[j] > a[j + 1]) {
						// 借助第三者达到位置的变化
						int temp;
						temp = a[j + 1];
						a[j + 1] = a[j];
						a[j] = temp;
					}
				}
			}
	        //打印排序后的数组
			for (int i = 0; i < a.length; i++) {
				System.out.println(a[i]);
			}
		}
	}


        分析总结:由于嵌套了两层循环,所以数据量无限大时,可以看做时间复杂度按为O(N^2).

 

          二,简单选择排序,这个就是咱们人最初的思维了,在一堆数中我们通过一次筛选选中最小的,然后从剩下的数中再此筛选,选出最小的……这样我们就排好了!好,来看一下简单选择排序的小例子:

	/**
	 * 简单选择排序
	 * @author Administrator
	 */
	public class selectSort {
		public static void main(String[] args) {
			int[] a = { 4, 3, 6, 1, 5, 7, 9, 2 };
			// 开始排序,拿出第一个数据做为目前已知最小的,和其他每个数据依次进行比较,
			// 碰到比自己小的,相互交换位置,直到找到最小的数据,也就成为了第一个元素
			for (int i = 0; i < a.length - 1; i++) {
				int min = i;
				// 进行比较,循环找最小的数据
				for (int j = i + 1; j < a.length; j++) {
					//如果比较的比我们最初设定的最小数小,则进行最小数min的重新制定
					if (a[min] > a[j]) {
						min = j;
					}
				}
				// 如果比较的元素比min小,则进行互换位置
				if (min != i) {
					int temp;
					temp = a[i];
					a[i] = a[min];
					a[min] = temp;
				}
			}
			//测试打印输出
			for (int i = 0; i < a.length; i++) {
				System.out.println(a[i]);
	
			}
		}
	
	}

          分析总结:这个也是循环嵌套了两层,所以说时间复杂度也是O(N^2),但是和冒泡排序比起来,它还是有优势的,因为它交换的次数少,找出一个最小的数据只需要一次交换,二冒泡排序可就多了,只不过他俩的比较次数是等级别的,因为交换也需要时间的消耗,所以简单选择排序还是有一定优势的,尤其是数据量相对来说少的时候。

 

          三,二分法查找:上边两个是排序中的基础算法,排好顺序了,也需要我们查找我们想要的数据了,而二分法查找就是其中常用的,节时的,基础的一种算法。二分查找就是从排序好数据的中间位置进行查找比较,类似于木棒的中间对砍,所以又叫折半查找,来看如何从上边排好的数组中进行查找:


	/**
	 * 二分法查找有序数列
	 * @author Administrator
	 */
	public class binary {
		//测试调用
		public static void main(String[] args) {
			int[] a={1,3,4,6,7,8,12};
			boolean isOk=binarySort(a, 12);
			System.out.println(isOk);
		}
	
		/**
		 * 二分法查找的核心
		 * @param a  存储数据的数组
		 * @param destElement 想要查找的数据
		 * @return boolean,是否找到了
		 */
		public static boolean binarySort(int[] a, int destElement){
		    //第一个数据,和最后一个数据
			int begin =0;
			int end=a.length-1;
			
			//只要小数不超过大数就一直循环
			while(begin<=end){
				//这是折半的,从中间查找
				int mid=(begin+end)/2;
				//如果是要查找的数据,则返回
				if(a[mid]==destElement){
					return true;
					//如果要查找的数据,比中间的数据小,则从前一半中查找
				}else if(a[mid]>destElement){
					end=mid-1;
					//如果要查找的数据,比中间的数据大,则从后一半中查找
				}else if( a[mid]<destElement){
					begin=mid+1;
				}
			}
			return false;
		}
	}

         分析总结:查找算法中,二分法是速度最快的,但是必须是有序的序列。分块查找,顺序查找的效率其次的。

 

 

        总之,这些都是算法的基础中的基础,还需要我们下大功夫来试验,来总结,来吸收,算法学习的坚持中……


    原文作者:查找算法
    原文地址: https://blog.csdn.net/liujiahan629629/article/details/19845347
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞