《程序员面试宝典读书笔》读书笔记7
2016-05-12 17:38
253 查看
1.变量的内存分配
C语言中有全局变量,本地变量,静态变量和寄存器变量。变量的内存地址分配是连续的,但是不同变量间的变量确有不同,本地变量和全局变量分配的内存相差十万八千里,而全局和静态变量间内存分配是连续的。这是因为全局和本地变量分配在不同类型的内存区域的结果,对于一个进程的内存空间而言,可以再逻辑上分为3个部分,代码区,静态数据区和动态数据区。动态数据区就是堆栈,堆和栈是两种不同的动态数据缓存区,栈是一种线性结构,堆是一种链式结构。
程序通过堆栈的基地址和偏移量来访问本地地址。堆栈是先进后出的数据结构,所以顶地址一定小于基地址。
heap是堆,stack是栈。
stack空间由操作系统自动分配,heap由程序员手动分配。
stack区域有限,heap很大。
malloc和new分配的空间就对应在heap上。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数参数的传递也在栈上进行。
2.树的相关知识
知道一个二叉树的前序序列和后序序列,不一定能够确定它的中序序列。
先序:根节点,左子树,右子树。
中序:左子树,根节点,右子树。
后序:左子树,右子树,根节点。
平衡树:平衡树是一颗空树或具有下列特点,它的左子树和右子树都是平衡二叉树,且左子树和右子树深度之差的绝对值不超过1。
3.排序
将输入按关键字递增或递减的输出。
1.快速排序法
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
2.冒泡排序法
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。
4.下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
5.再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
3.Shell排序法
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
C语言中有全局变量,本地变量,静态变量和寄存器变量。变量的内存地址分配是连续的,但是不同变量间的变量确有不同,本地变量和全局变量分配的内存相差十万八千里,而全局和静态变量间内存分配是连续的。这是因为全局和本地变量分配在不同类型的内存区域的结果,对于一个进程的内存空间而言,可以再逻辑上分为3个部分,代码区,静态数据区和动态数据区。动态数据区就是堆栈,堆和栈是两种不同的动态数据缓存区,栈是一种线性结构,堆是一种链式结构。
程序通过堆栈的基地址和偏移量来访问本地地址。堆栈是先进后出的数据结构,所以顶地址一定小于基地址。
heap是堆,stack是栈。
stack空间由操作系统自动分配,heap由程序员手动分配。
stack区域有限,heap很大。
malloc和new分配的空间就对应在heap上。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数参数的传递也在栈上进行。
2.树的相关知识
知道一个二叉树的前序序列和后序序列,不一定能够确定它的中序序列。
先序:根节点,左子树,右子树。
中序:左子树,根节点,右子树。
后序:左子树,右子树,根节点。
平衡树:平衡树是一颗空树或具有下列特点,它的左子树和右子树都是平衡二叉树,且左子树和右子树深度之差的绝对值不超过1。
3.排序
将输入按关键字递增或递减的输出。
1.快速排序法
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
void quick_sort(int *list,int left,int right) //L是基数 { if(L<R) { int i=1,j=R,x=list[L]; while(i<j) { while(i<j&&s[j]>=x) //从右边找小于基数的数填到s[i] j--; if(i<j) s[i++]=s[j]; while(i<j&&s[i]<=x) //从右边找大于基数的数填到s[j] i++; if(i>j) s[j--]=s[i]; } s[i]=j; quick_sort(* list,1,i-1); quick_sort(* list,i+1,r); }
2.冒泡排序法
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。
4.下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
5.再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
void Bubblesort(int* s,int n) { int j,k; bool flag=true; k=n; while(flag) { flag=false; for(j=1,j<k;j++) if(a[j-1]>a[j]) { swap(a[j-1],a[j]); flag=true; } k--; } }
3.Shell排序法
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
相关文章推荐
- 一个前端练手作品——前端新人如何求职?
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 葱课 现场面试 2016.5.12
- 剑指offer 面试题(打印1到n最大的n位整数)(6)
- 面试-css样式
- 1000个苹果
- 一个10年的程序员的感叹!
- Java面试题--只提出了问题
- java 开发面试题小整理(二)
- Java基础面试复习一
- 2016年5月百度php实习生电话面试总结
- Java面试题--关于 OOP 和设计模式
- Java面试题--其他各式各样的问题
- Java面试题--集合框架
- Java面试题--内存
- Java面试题--JVM 底层 与 GC(Garbage Collection)
- 【WG面试算法】链表反转
- Java面试题--数据类型和java基础
- 【WG面试算法】一个有getMin功能的栈
- 剑指offer之面试题40数组中只出现一次的数字