版权声明:转载请注明出处 https://blog.csdn.net/menwaiqingshan/article/details/86554951
数据结构研究数据之间的关系
逻辑结构
1.集合结构
2.线性结构
3.图形结构
4.树形结构
存储结构
1.表
2.堆栈
3.队列
4.数组
5.树
6.二叉树
7.图
算法
一个算法的优劣程度可以用空间复杂度和时间复杂度来衡量。
空间复杂度:是一个算法在运行过程中临时占用存储空间大小的度量
时间复杂度:是一个算法在运行过程中所需要计算的工作量
时间复杂度是将输入值趋近无穷的情况
比如:
public void function1() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// dosomething;
}
}
for (int i = 0; i < n; i++) {
//dosomething
}
// dosomething
}
该程序计次 n²+n+1
n取无穷大,时间复杂度o(n)=n²
数据结构
互相存在一种或多种特定关系的数据元素的集合
程序
程序 = 数据结构 + 算法
程序好坏 = 时间复杂度 + 空间复杂度 + 实际应用场景 + 可读性
顺序存储
优点:尾插效率高,支持随机访问
缺点:中间插入和删除效率低
数组、Arraylist
两数交换
int t = a;
a = b;
b = t;
//加减法
a=a+b;
b=a-b;
a=a-b;
//性能最优,但无可读性
a = a ^ b;
b = a ^ b;
a = a ^ b;
位运算
异或不同为1,相同为0
蛮力法(穷举法、枚举法)
数据量小,效率是最高
数据量大,非常慢
冒泡排序
冒泡排序
//比较数值,交换
public void bubbleSort1(int[] array) {
int temp;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length-i-1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
第一层 内部循环n
第二层 n-1
第三层 n-2
第三层 n-3
所以时间复杂度 n+(n-1)+(n-1)...+1=n*1+n*(n-1)/2=n*(n+1)/2
–>优化
//添加flag,一旦某次循环中没有出现任何的交换说明数组已经有序
public void bubbleSort(int[] array) {
for (int i = 0; i < array.length; i++) {
boolean flag = true;
for (int j = 0; j < array.length - 1 - 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;
}
}
}
选择排序
//查找出最小值,交换
public 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;
}
}
if (i != index) {
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
}