做为数学专业的我,其实一直特别喜欢数学,只不过大学的数学课程让我有点失望,所以选择了专心学习另一个行业计算机,但是随着学习的不断深入,感觉到了数学魅力,数学可以运用到几乎所有的行业,它无处不在,在计算机中一个看似复杂的问题,其实在数学中也平凡不过。去年参加软考中设计了算法,因为当时时间比较紧,而且为了应付考试,所以算法学习的不够深入,仅仅是理论上的理解,还没有真正的运用到代码上边,更或者,还不知道如何在软件运用中让它发挥它的威力。但是基础总是要打的,从今天开始,利用业余时间学习学习算法,希望自己能坚持下去!
这里先看看我的以前的一篇关于数据结构的总括博客:软考(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;
- }
- }
分析总结:查找算法中,二分法是速度最快的,但是必须是有序的序列。分块查找,顺序查找的效率其次的。
总之,这些都是算法的基础中的基础,还需要我们下大功夫来试验,来总结,来吸收,算法学习的坚持中……
|