查找排序的相关算法

1、折半查找非递归算法

int Binary_Search(SqList L,ElemType key)
{
		int low = 0,high = L.length - 1,mid;
		while(low <= high)
		{
				mid = (low+high)/2;
				if(L.elem[mid] == key)
						return mid;
				else if(L.elem[mid] > key)
						high = mid-1;
				else
						low = low+1;
		}
		return -1
}

2、折半查找递归算法

int BinSearch_Cur(SqList L,keyType key,int low,int high)
{
		if(low > high)
				return 0;
		if(low <= high)
		{
				mid = (low+high)/2;
				if(L.elem[mid] == key)
						return mid;
				else if(key < L.elem[mid])
						return BinSearch_Cur(L,key,low,mid-1);
				else
						return BinSearch_Cur(L,key,mid+1,high);
		}
}

3、判断是否为二叉排序树(判断结点之前的关系)
算法思想
根据二叉排序树的定义,对二叉排序树进行递归的遍历,左子小,右子大,一旦不满足则不是

void JudgeBST(BiTree ,int &flags)
{
		if(T != NULL && flag)
		{
				judgeBST(T->lchild,flag);//中序遍历左子树
				if(pre == NULL)//中序的第一个结点不必判断
						pre = T;
				else if(pre->data < T->data)//如果前驱的结点值小于根结点,则是否则不是
						pre = T;
				else 
						flag = 0;
				JudgeBST(T->rchild,flag);//中序遍历右子树
		}
}

4、判断二叉排序树(中序遍历判断次序)
算法思想
二叉排序树的中序序列为递增,对于二叉树的中序遍历,如果始终能保持前一个值比后一个值小,则为二叉排序树

int judgeBST(BSTNode *bt)
{
		int b1,b2;
		if(bt == NULL)
				return 1;
		else
		{
				b1 = judgeBST(bt->lchild);
				if(b1 == 0 ||pre > bt->data)//当树为空或者前一个树比后一个树大则返回0
						return 0;
				pre = bt->data;//保存当前结点
				b2 = judgeBST(bt->rchild);
			
				return b2;
		}
}

5、判断二叉树是否为平衡二叉树
算法思想

void judgeAVL(BSTNode *bt,int &balance,int &h)//(每看懂)
{
		int bl,br,hl,hr;
		if(bt == NULL)
		{
				h = 0;
				balance = 1;
		}
		else if(bt->lchild == NULL && bt->rchild == NULL)
		{
				h = 1;
				balance = 1;
		}
		else
		{
				judgeAVL(bt->lchild,balance,h1);
				judgeAVL(bt->rchild,balance,hr);
				h = (h1>h2:hl:hr) + 1;
				if(abs(h1-h2) < 2)
						balance = bl&br;
				else
						balance = 0;
		}
}

6、计算AVL中所有结点的平衡因子

int Computebf(BSTNode *&b)
{
		int max1,max2;
		if(b == NULL)
				return 0;
		if(b->lchild == NULL && b->rchild == NULL)//如果是叶子结点bf为0,高度返回1
		{
				b->bf = 0;
				return 1;
		}
		else//否则分别计算左右子树的高度
		{
				max1 = Computebf(b->lchild);
				max2 = Computebf(b->rchild);
				b->bf = max1-max2;//bf为左右子树的高度差
				return (max1>max2:max1+1:max2+1);
		}
}

7、快速排序
算法思想
从左往右找小于中枢的结点,从右往左找大于中枢的结点
当low和high碰到头的时候把低的数据给高的位置,因为要进行排序

int partition(SqList &L,int low,int high)
{
		L,r[0] = L,r[low];
		pivotkey = L.r[low].key;
		while(low < high)
		{
				while(low < high && L.r[high].key >= pivotkey)
				--high;//从左往右找小于中枢的结点
				while(log < high && L.r[low].key <= pivotkey)
				++low;//从右往左找大于中枢的结点
				L.r[high] = L.r[low];//把比中枢大的移动到高端,(为沙移动这个)
		}
	L.r[low] = L.r[0];
	return low;//返回中枢位置(为沙返回这个值)
}
void QSort(SqList &L,int low,int high)
{
		if(low < high)
		{
				priotloc = partition(L,low,high);
				QSort(L.low,priotloc-1);
				QSort(L,pivotloc+1,high);
		}
}

8、编写算法负值在前,非负在后
算法思想
从左往右找负,从右往左找正

void process(int a[],int n)
{
		int low = 0,high = n-1;
		while(low < high)
		{
				while(low < high && L.r[high].key > 0)//并且当前的结点大于0则继续,否则停止
				high--;
				while(low < high && L.r[low.key] < 0)//并且当前的结点小于0则继续,否则停止
				low++;
				if(low < high)
				{	
						temp = L.r[high].key; L.r[high].key = L.r[low].key;L.r[low].key = temp;
						low++;
						high--;				
				}
		}
}

9、编写算法要求左小于k,右边大于k
算法思想
从左往右找小于k,从右往左找大于k

void process(int a[],int n,int k)
{
		int low = 0,high = n-1;
		while(low < high)
		{
				while(low < high && a[high] > k)//从左往右找小于k,如果low<high,并且当前的结点大于k则继续,否则停止
				high--;
				while(low < high && a[low] < k)//从右往左找大于k,如果low<high,并且当前的结点小于k则继续,否则停止
				low++;
				if(low < high)
				{
						temp = a[low];a[low] = a[high];a[high] = temp;
						high--;
						low++;
				}
		}
}

10、元素递增有序编写算法完成以下要求
(1)查找值为x的元素
(2)查找到后与后继元素交换位置
(3)若查找不到则插入到表中仍然保持有序
算法思想
采用快排的思想查找值x,如果找到则输出,并且交换x的和后继的位置,

void SearchExchangeInsert(ElemType a[],ElemType x)
{
		int low = 0,high = n-1;
		while(low <= high)
		{
				mid = (low + high)/2;//折半查找
				if(a[mid] == x)
						break;//找到了
				else if(a[mid] < x)
					low = mid+1;
				else
					high = mid-1;
		}
		if(a[mid] == x&& mid != n)//找到后交换
		{
				int temp = a[mid];
				a[mid] = a[mid+1];
				a[mid+1] = temp;
		}
		if(low > high)//当low>high时说明没有找到
		{
				for(i = n-1;i > high;i--)//将元素后移,high的位置为最后结点的位置
				{
							a[i+1] = a[i];
				}
				a[i+1] = x;
		}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值