二分搜索+快速排序

二分查找
描述给定已排好序的n个元素a[0:n-1],找出特定元素x
思路用二分搜索算法的基本思想,将n个元素分成两半,将a[n/2]与x进行比较。如果x=a[n/2],则找到x,算法终止.如果x<a[n/2],则在数组a的左半部继续搜索x.如果x>a[n/2],则在数组a的右半部继续搜索x
输出如果k在序列中,输出Yes,否则输出No



int binarySearch(int [] a,int x,int n ){
//在a[0]<=a[n-1]中搜索x
//找到x时返回其在数组的位置,否则返回-1

	int left = 0, right = n-1;

	while(left <= right){

		mid = (left + right) / 2;

		if(x==a[mid] ) return mid;
		
		 if(x>a[mid] )
		 
		 left = mid +1;

		}

		else right= mid - 1;

		}
		
return -1;

}

int main(){

	getdata();

	for(int i = 0; i < m; i++){

		int ret = search(check[i]);

		if(ret){

			cout << "Yes" << endl;

		}

		else{

			cout << "No" << endl;

		}

	}

	return 0;

}

快速排序算法基本思想是:对输入的子数组a[p:r],按以下三个步骤进行排序。
(1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。
(2)递归求解: 通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。
(3)合并: 由于对a[p:q-1]和a[q+1:r]的排序是就地进行,所以在a[p:q-1]和a[q+1:r]都已排好的序后,不需要执行任何计算,a[p:r]就已排好序。

private static void qSort(int p,int t)

{

if(p<r){//至少两个元素

int q=partition(p,r);//从p,r中取q

qSort(p,q-1);//左半右排序

qSort(q+1,r);//右半段排序
}
}

上述算法中的partition

private static void partition (int p,int r)

{

int i=p,

j=r+1;

Comparable x=a[p];//将<x的元素交换到左边区域
//将>x的元素交换到右边区域

while (true){

while (a[++i],compareTo(x)<0&&i<r);//i<x

while (a[--j],compareTo(x)>0);//i>x
//符合一直循环下去,不符跳出
if(i>=j) break;

MyMath.swap(a,i,j);

}

a[p]=a[j];

a[j]=x;

return j;

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值