程序是数据结构和算法的组合。
数据结构
是计算机存储、组织数据的方式,包括逻辑结构和存储结构。数据结构往往同高效的检索算法和索引技术有关。
逻辑结构是比较抽象的而存储结构是具体的。
逻辑结构有如:集合结构,线性结构,树形结构,图形结构 。
存储结构有如:表,堆栈,队列,数组,树,二叉树,图。
存储结构就是逻辑结构在计算机系统里的具体实现了。如线性的结构的实现可用,数组和链表。
算法(Algorithm)
算法是解决方案的描述,一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
空间复杂度O(n)是指运行时所需要的运行内存。 时间复杂度是指关键代码执行的次数。
变量的交换
程序好坏=空间复杂度+时间复杂度+应用场景(重要)
public void testSwap() {
int a = 5;
int b = 6;
//1 可读性最好的 在手机和平板电脑上使用
// int t=a;a=b;b=t;
//2 有可能会超出int的最大范围
// a=a+b;// a=11 b=6
// b=a-b;// a=11 b=5
// a=a-b;// a=6 b=5
//3 性能最优(没有可读性) 无人机 跑步机,时间空间都最优。但是要看场景
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a=" + a + "--- b=" + b);
}
线性表- 顺序存储结构-顺序表
顺序表有前驱和后续概念。a1是a2的前驱,ai+1 是ai的后继,a1没有前驱,
an没有后继 n为线性表的长度 ,若n==0时,线性表为空表。
优点: 尾插效率高,支持随机访问。
缺点: 中间插入或者删除效率低。
在java中的应用有: 数组 和 ArrayList 重要接口有() add() remove()
蛮力法
蛮力法(brute force method,也称为穷举法或枚举法) 是一种简单直接地解决问题的方法, 常常直接基于问题的描述, 所以,蛮力法也是最容易应用的方法。 但是,用蛮力法设计的算法时间特性往往也是最低的, 典型的指数时间算法一般都是通过蛮力搜索而得到的 。(即输入资料的数量依线性成长,所花的时间将会以指数成长)
这种算法量在数据量足够小(个位数的情况下)的时候最快的( n<5)。
1,冒泡排序,数据足够小的时候 8个内,比如斗牛游戏的牌面排序
原理: 从第一个数据开始,比较相临的两个相,如果不符合次序就交换 ,像气泡一样。
O(n) = n ,n-1 ...1 = n*(n-1)/2 -->n
public static void bubbleSort(int[] array){
//3 1 5 8 2 9 4 6 7 n*(n-1)/2 n
for(int i=array.length-1;i>0;i--) {
boolean flag=true;
for (int j = 0; j < i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag=false;
}
}
if(flag){
break;
}
}
}
2。选择排序 ,快速排序的基础
原理: 1,取数组的第1个作用比较对象。如果后面有比它小的数据,就把的下标,赋值给index再作为比较对象。循环一遍后就找了最小的数据的下标。2, 进行交换。 3,以此类推。
public static void selectSort(int[] array){
for(int i=0;i<array.length-1;i++) {
int index = i;
for (int j = i+1; j < array.length; j++) {
if (array[j] < array[index]) {
index = j;
}
}
//{1,2,5,8,3,9,4,6,7};
if(index!=i) {//如果已经是最小的,就不需要交换
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
}