一数据结构1.你熟悉什么数据结构?
数组链表
堆栈队列散列
二叉树二叉搜索树二叉山
b树b树
2.b树 b+树 b*树
B和B两个节点都可以有很多子节点。 不同之处在于,b树中的所有节点都可以存储关键字,而b树中只有叶节点存储关键字,并且适合数据库索引。
3.树的中序遍历
4.二叉平衡树,怎么用一维数组存储
使用数组存储时,二叉树节点按层次顺序放置在数组中的相应位置。 如果某个节点左边的孩子或右边的孩子是空的,则数据的相应位置也是空的。
设计思路:
设父节点的下标为p
左孩子的下标=2p 1
右子代下标=2p 2
相反,左子下标是l,其父节点的下标是(l - 1 )/2
二算法1.快排?快排的实现过程?复杂度如何?简单代码实现?
方式:
双边循环法(代码实现复杂) )
单边循环法(推荐) ) ) ) ) ) )。
复杂度:
nlogn
单边循环法实现过程
1-首先找到基础元素,然后开始下标
2-导线,如果元素小于基准元素,则下标1
该元素与对应于下标的元素交换位置
3-遍历完成后,基准元素将与当前下标元素交换位置,并将基准元素分成两组数据
4-递归调用两侧的数据并进行拆分,在开始下标和结束下标结束之前无法拆分
5-遍历数组元素即可
单边循环法代码实现:
publicstaticvoidquicksort (int [ ] arr,int startIndex,int endIndex )//递归终止条件:如果startIndex大于或等于endIndex,则为if ) startindex=endex ////基于标准元素,分两部分递归地执行quicksort(ARR,startIndex,pivotIndex - 1 ); 快速索引(arr,pivotIndex 1,endIndex ); } /** *分治(单边循环法) * @param arr要交换的数组) * @param startIndex开始下标(* @param endIndex结束下标(/privatestaticintpartition ) int int聪明的白猫=startIndex; for(intI=startindex1; i=endIndex; I ) if(arr[I]pivot ) )聪明的白猫; int p=arr[聪明的白猫] arr[聪明的白猫]=arr[i]; arr[i]=p; }} arr[startIndex]=arr[聪明的白猫]; arr[聪明的白猫]=pivot; return聪明的白猫; } publicstaticvoidmain (string (args ) int ) arr=newint ) ) 4、4、6、5、3、2、8、1 ); 快速引导(arr,0,arr.length-1 ); system.out.println (arrays.tostring (arr ) ); }说明:
递归代码的书写特点,先找到一个循环的代码,在找出跳出循环的条件,递归的调用循环代码。
2.二分查找原理,简单的一个代码
算法思想:
设定开始位置start、结束位置end以及中间位置mid=(end start )/2,
如果arr[index]=mid,则返回mid
对于arr[index]mid,请从下半部分开始搜索,并将start设置为mid 1
对于arr[index]mid,请从下半部分开始搜索,并将end设置为mid-1
如果是startend,则返回-1,表示所检查的元素不存在
代码:
public class select1_ suan fa2 { publicstaticvoidmain (string [ ] args ) }
System.out.println(select(44));}public static int select(int target) {//定义数组int[] arr = {21,32,36,44,45,36,47,38,29};//定义初始位置int start = 0;//定义结束位置int end = arr.length-1;//定义中间位置int mid = (start+end)/2;while(true) {//如果没有这个元素,则start>=end,返回-1if(start>end) { return -1;}//判断是否和中间位置元素值相等if(arr[mid] == target) {//将中间位置的索引赋值给目标位置return mid;}else {if(arr[mid] > target) {//将end位置设置为中间位置减一end = mid-1;}else {//将start位置设置为中间位置加1start = mid+1;}//取出新的中间位置(别忘记了)mid = (start+end)/2;}}} }3.怎么判断链表是否有环?
思路:
两个指针分别按照固定步长行走,P1一次走1布,P2一次走2布,如果链表有环,P1和P2会有相遇的时刻。(追击问题解法)
代码:
/** * 判断是否有环 * @param head 链表头节点 */ public static boolean isCycle(Node head) { Node p1 = head; Node p2 = head; while (p2!=null && p2.next!=null){ ; p1 = p1.next; p2 = p2.next.next; if(p1 == p2){ return true; } return false; } /** * 链表节点 */ private static class Node { int data; Node next;Node(int data) { this.data = data; } } public static void main(String[] args) throws Exception { Node node1 = new Node(5); Node node2 = new Node(3); Node node3 = new Node(7); Node node4 = new Node(2); Node node5 = new Node(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node2; System.out.println(isCycle(node1)); }4.链表的定义,怎么实现链表翻转?
链表翻转代码参考: https://blog.csdn.net/xu491361421xiao/article/details/81385435
5.怎么求数组的最大子序列和
6.栈中最小值
代码如下: