数据结构与算法
一、数据结构
- 1、栈stack
按照LIFO后进先出的原则 - 2、队列Queue
按照FIFO先进先出的原则 - 3、链表
包括单向,双向,循环三种链表 - 4、散列表
也叫hash哈希表,通过映射函数把关键码值(K,V)的hash码值映射到表中的一个位置。 - 5、二叉树
添加和删除基本满足二分查找法,从根节点进行比较,直到子节点为null - 6、红黑树
特性:
根节点必须是黑色;
每个节点是黑色或红色;
每个叶子节点必须是黑色;
如果一个节点是红色,那么其子节点必须是黑色;
从一个节点到该节点的子孙节点的所有路径上包含相同数量的黑色节点。
红黑树通过左旋和右旋进行树的平衡。 - 7、图
有穷非空集合的顶点与顶点之间的边组合成的集合,包括有向图和无向图,其中图的遍历分为广度优先搜索和深度优先搜索。 - 8、位图
MXN维数组char[M][N]
二、算法
- 1、常用算法包括查找算法和排序算法。
查找算法
线性查找算法,广度优先搜索算法,深度优先搜索算法和二分查找算法。
Example(二分查找):
要求待查找的序列是有序的(默认是升序),根据待查值与序列的中间位置的值进行比较,相等即返回,小于则从左边查找,大于从右边查找。
//以有序数组int[] array为例
public static int search(int[] array,int a){
int low = 0;
int high = array.length-1;
int mid;
while(low<=high){
mid = (high-low)/2+low;
if(array[mid]==a){
return array[mid];
}else if(array[mid]<a){
low = mid +1;
}else{
high = mid -1;
}
}
return -1;
}
排序算法
冒泡排序算法,插入排序算法,快速排序算法、希尔排序算法、归并排序算法、桶排序算法、堆排序算法和基数排序算法。
Example(冒泡排序)
重复访问元素,依次比较相邻两个元素大小,进行位置交换。
//以数组int[] sort[]为例
public static int[] bubbleSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-j;j++){
if(arr[i]>arr[j]){
int temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
return arr;
}
Example(插入排序)
如果要一个已经排好序的数据序列中插入一个数据,依然保持有序。适用于数据量较少的序列排序。
**原理:**将序列分成两个序列,一个有序,一个无序。一般将序列第一个元素作为有序序列,从另一个序列中逐个取出插入有序序列中,从右向左,插入比自己大的元素后面,有序序列其他比自己大的所有元素后移。
public static int[] insertSort(int[] arr){
for(int i =1;i<arr.length;i++){
int insertVal = arr[i];
int index = i-1;
while(index>=0&&inserVal<arr[index]){
arr[index+1]=arr[index];
index--;
}
arr[index+1]=inserVal;
}
return arr;
}
Example(快速排序)
将序列分为两部分,一部分所有元素比另外一部分都小,再对两部分分别排序,最后合并。
**原理:**从后向前比较,用基准值和最后一个值比较,如果基准值小,则交换位置,如果比基准值大,则继续比较下一个值,知道找到第一个比基准值小的值才交换位置。找到后,从前向后开始比较,如果有比基准值大的,则交换位置,如果没有就继续比较下一个,知道找到第一个比基准值大的值才交换位置。
public static int[] quickSort(int[] arr,int low,int high){
int start = low;
int end = high;
int key = arr[low];
while(end>start){
while(end>start&&arr[end]>=key){
end--;
}
if(arr[end]<=key){
int temp = arr[end];
arr[end] = arr[start];
arr[star] = temp;
}
while(end>start&&arr[start]<=key){
start++;
}
if(arr[start]>=key){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
if(start>low) quckSort(arr,low,start-1);
if(end<high) quckSort(arr,end+1,high);
return arr;
}
- 2、其他算法
剪枝算法、回溯算法、最短路径算法、最大子数组算法和最长公因子算法等。