算法期末复习

算法分析期末复习梳理

  • 第三章递归算法设计技术
    • Hanoi的递归过程
    • n!的求解
    • 用递归的方式来创建二叉树
  • 第四章分治法设计技术
    • 快排思想
    • 归并排序思想

第三章递归算法设计技术

递归的含义:
算法期末复习_第1张图片
在进行递归的时候要满足三个条件:
算法期末复习_第2张图片
哪些情况要用到递归:
1、定义是递归的
2、数据结构是递归的,(单链表、二叉树)
3、问题的求解方法是递归(Hanoi)

Hanoi的递归过程

首先要遵守的规则:
每次只能移到一个盘片;盘片可以放在X、Y、Z、的任意一个位置上;不允许大的放在小的上面。

分解过程:

Hanoi(n,x,z,y);
//分解为n-1的小问题
Hanoi(n-1,x,z,y);

n!的求解

递归的出口:fun(1)=1
递归的关系:fun(n)=n*fun(n-1) n>1
算法期末复习_第3张图片

用递归的方式来创建二叉树

typedef int ElemType;
typedef struct node 
{
     	ElemType data;				//数据元素
	struct node *lchild;		//指向左孩子结点
	struct node *rchild;		//指向右孩子结点
} BTNode;						//二叉链结点类型

BTNode *CreateBTree(ElemType a[],ElemType b[],int n)	//对应例2.8的算法
//由先序序列a[0..n-1]和中序序列b[0..n-1]建立二叉链
{
     
	int k;
	if (n<=0) return NULL;
	ElemType root=a[0];			//根结点值
	BTNode *bt=(BTNode *)malloc(sizeof(BTNode));
	bt->data=root;
	for (k=0;k<n;k++)			//在b中查找b[k]=root的根结点
		if (b[k]==root)
			break;
	bt->lchild=CreateBTree(a+1,b,k);			//递归创建左子树
	bt->rchild=CreateBTree(a+k+1,b+k+1,n-k-1);	//递归创建右子树
	return bt;
}

第四章分治法设计技术

算法期末复习_第4张图片
分治法的步骤:
算法期末复习_第5张图片
分治法的一般的算法设计框架

divide-and-conquer(p)
{
     
	if |p|<=n
		return adhoc(p);
	for(i=1;i<k;i++)//循环处理k次 
		yi=divide-and-conquer(p);//递归解决p 
	return merge(y1,y2,y3,y4...);//合并子问题 
}

快排思想

算法期末复习_第6张图片

#include
int partition(int a[],int low,int high)
{
     
	int pivot=a[low];
	while(low<high)
	{
     
	while(low<high&&a[high]>=pivot)
		--high;
	a[low]=a[high];
	while(low<high&&a[low]<=pivot)
		++low;
	a[high]=a[low];
	}
	a[low]=pivot;
	
	return low;
}
void qsort(int a[],int low,int high)
{
     
	if(low<high)
	{
     
		int pivotloc;
		pivotloc=partition(a,low,high);
		qsort(a,low,pivotloc-1);
		qsort(a,pivotloc+1,high);
		
	}
}
int main()
{
     
	int a[]={
     27,38,13,65,49}; 
	qsort(a,0,5);
	printf("Qsort Arrary:");
	for(int i=1;i<=5;i++)
	{
     
		printf("%d ",a[i]);
	}

	return 0;
}

归并排序思想

算法期末复习_第7张图片

你可能感兴趣的:(算法,二叉树)