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