您的位置:首页 > 职场人生

《程序员面试宝典读书笔》读书笔记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.再对左右区间重复第二步,直到各区间只有一个数。

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排序法

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: