折半查找的递归算法
折半查找 / 二分法查找
示例
输入
1 2 3 4 5
3
输出
下标为:2
思路
-
输入数组元素,元素必须有序。输入要查找的元素。
-
定义折半查找的递归函数,传入参数有:数组,查找元素,左端点下标,右端点下标。
-
当左端点下标大于右端点时,退出递归,表示查找失败。否则,定义中间变量的下标mid,当查找元素x等于a[mid]时,表示找到了该元素,返回下标mid;当查找元素x>a[mid]时,表示该元素在区间右半段,所以继续递归,左右区间端点分别为mid+1、right;当查找元素x<a[mid]时,表示该元素在区间左半段,因此继续递归,左右区间端点分别为left、mid-1。
具体实现
#include<bits/stdc++.h>
using namespace std;
int BinarySearch(int a[], int x, int left, int right){
if(left>right)
return -1; //查找失败
int mid = (left+right)/2;
if(x==a[mid]) //查找成功,返回下标
return mid;
else if(x<a[mid]) //x在区间左半段
return BinarySearch(a,x,left,mid-1);
else //x在区间右半段
return BinarySearch(a,x,mid+1,right);
}
int main(){
int a[100],n=0,x,b;
while(cin>>b){ //输入数组元素,必须有序
a[n++]=b;
if(cin.get() == '\n') break;
}
cin>>x; //输入要查找的数
int f = BinarySearch(a,x,0,n-1); //调用折半查找
if(f==-1) cout<<"不在数组中";
else cout<<"下标为:"<<f;
return 0;
}
快速排序
递归实现快排。
示例
输入:3 9 2 4 1 0
输出:0 1 2 3 4 9
思路
-
在待排序的数组中,首先找一个数字作为基准数,为了方便,一般选第一个数作为基准数key。
-
把待排序的数列中小于key的元素移到左边,大于key的元素移到右边,此时,左右两个分区的元素就相对有序了。
-
接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数key,然后移动,直到各个分区只有一个数时为止。
具体实现
#include<bits/stdc++.h>
using namespace std;
void QuickSort(int a[], int left, int right){
if(left<right){ //不加会陷入死循环
int i=left, j=right;
int key=a[left];
while(i<j){
while(i<j && a[j]>key)
j--;
if(i<j) //右半段的数比key小
a[i++]=a[j]; //先赋值再自增
while(i<j && a[i]<key)
i++;
if(i<j) //左半段的数比key大
a[j--]=a[i]; //先赋值再递减
}
a[i]=key;
QuickSort(a,left,i-1); //给左边排序
QuickSort(a,i+1,right); //给右边排序
}
}
int main(){
int a[100],n=0,b;
while(cin>>b){ //输入数组元素
a[n++]=b;
if(cin.get() == '\n') break;
}
QuickSort(a,0,n-1); //快排函数
for(int i=0; i<n; i++) //输出排序后的数组元素
cout<<a[i]<<" ";
return 0;
}
小结
理解的排序思想,代码就不难写了。平时还是要多写,才能熟练。