1.线性结构
数据之间存在一对一的关系(前驱、后件):线性表、数组、栈、队列。
分为顺序存储结构(顺序表)和链式存储结构(链表)。
非线性结构:树、图、二维数组。
2.栈
先进后出,后进先出。
链表实现栈(动态栈)。
数组实现栈(静态栈)。
练习: 数组实现栈,完成String类型的四则运算。
3.链表
data和next。
功能:
添加,
插入,
修改,
删除
查看
双向链表
1.末尾添加
2.删除,修改,查询和单链表类似。
3.环形单链表:
查看:
解决约瑟夫问题
面试题,反转链表:
4.队列
常见队列:顺序队列、链式队列、循环队列、阻塞队列、并发队列。
方法:enqueue(),outqueue();
假溢出:head和tail相同且指向最后一个元素的下一个;
真溢出:满了,只有tail指向最后一个元素的下一个位置。
- 顺序队列:
4.稀疏数组
稀疏数组第一行不记录有效数据。
5.各类时间复杂度
6.基数排序
7.冒泡排序
不再赘述
8.快速排序
感觉上述逻辑不清晰,清晰版如下:
package com.dataStructure;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a=new int[]{2,5,70,5,4};
QuickSort q=new QuickSort();
q.qucikSort(a,0,4);
System.out.println(Arrays.toString(a));
}
public void qucikSort(int [] arr,int start, int end){
int i=start,j=end;//设置数组两头两个指针
int pivot=arr[start];//选第一个数为基准
while(i<=j){
while(arr[i]<pivot){
i++;
}
while(arr[j]>pivot){
j--;
}
if(i<=j){
swap(arr,i,j);
i++;
j--;
}
}
if(start<j)
qucikSort(arr,start,j);
if(i<end)
qucikSort(arr,i,end);
}
//交换数组中两个元素
public void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
9.插入排序
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] a =new int[]{5,4,8,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a){
for (int i =1;i<a.length;i++){
for (int j=i;j>=1;j--){
if (a[j]<a[j-1]){
int t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}else{
break;
}
}
}
}
}
10.选择排序
package com.dataStructure;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int[] a =new int[]{5,4,8,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a){
for (int i =0;i<a.length-1;i++){
int p=i,j;
for (j=i+1;j<a.length;j++){
if(a[p]>a[j]){
p=j;
}
}
int temp=a[p];
a[p]=a[i];
a[i]=temp;
}
}
}
11.希尔排序
其中,每组在进行插入排序。增量每次除二,当增量为一时,排序完成。
分治