二分查找 | |
---|---|
描述 | 给定已排好序的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;
}