二分搜索+快速排序

二分查找
描述 给定已排好序的n个元素a[0:n-1],找出特定元素x
思路 用二分搜索算法的基本思想,将n个元素分成两半,将a[n/2]与x进行比较。如果x=a[n/2],则找到x,算法终止.如果xa[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

上述算法中的partition

private static void partition (int p,int r)

{

int i=p,

j=r+1;

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

while (true){

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

MyMath.swap(a,i,j);

}

a[p]=a[j];

a[j]=x;

return j;

}

二分搜索+快速排序_第1张图片

你可能感兴趣的:(二分搜索+快速排序)