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

来源:互联网 发布:网络洗钱的常见方式 编辑:程序博客网 时间:2024/06/11 00:09

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


    这里先看看我的以前的一篇关于数据结构的总括博客:软考(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;}}

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

 

 

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






3 0