1.快速排序
快速排序的思想是基于分治来做的,过程是:
- 确定分界点:左右边界和中间都可以。
- 调整区间,把整个区间根据x的值分为两半,把小于等于x的放在x左边。
- 递归处理左右两边。
模板:
void quick_sqrt(int q[],int l,int r){
if(l >= r) return ;
int x = q[l + r >> 1],i = l - 1,j = r + 1;
while(i < j){
do i++;while (x > q[i]);
do j--;while (x < q[j]);
if(i < j) swap(q[i],q[j]);
}
quick_sqrt(q,l,i-1);quick_sqrt(q,i+1,r);
}
2.归并排序
归并排序的主要思想也是分治,过程是:
- 确定分界点
- 把左边右边分别递归排序。
- 归并左边右边,合二为一。
void merge_sort(int q[],int l,int r){
if(l >= r) return;
int mid = r + l >> 1;
merge_sort(q,l,mid);merge_sort(q,mid+1,r);
int i = l,j = mid + 1,k = 0;
while(i <= mid && j <= r){
if(q[i] > q[j]) tmp[k++] = q[j++];
else tmp[k++] = q[i++];
}
while(i <= mid) tmp[k++] = q[i++];
while(j <= r) tmp[k++] = q[j++];
for(int i = l,j = 0;i <=r;) q[i++] = tmp[j++];
}
3.二分算法
整数二分:
int bsearch_1(int l,int r){
while(l < r){
int mid = l + r >> 1;
if(check(q[mid])) r = mid;
else l = mid + 1;
}
return l;
}
int bsearch_2(int l,int r){
while(l < r){
int mid = l + r + 1 >> 1;
if(check(q[mid])) l = mid;
else r = mid - 1;
}
return l;
}
小数二分:
double bsearch_3(double l,double r){
while(l - r > 1e-6){
double mid =(l + r)/2;
if(mid * mid >= 2) l = mid;
else r = mid - 1;
}
return l;
}