快速排序:l<---------------------------->r
基本思想:
1、确定分界点如q[l]或者q[r]或者q[(l+r)/2],分界点是随机的
2、调整区间:<=x >=x ,x是可变的
3、运用递归处理左右两端数据
第一种写法
void quick_sort(int q[],int l,int r) //形参记得确认数据类型
{
if(l>=r)return;
int x = q[(l+r)/2],i = l-1,j = r+1; //运用l-1和r+1是因为后面使用了do...while循环
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j)swap(q[i],q[j]);
}//确认好区间
//运用递归处理左右两边的数据
quick_sort(q,l,j); //在上一次分割中又重新定义左右两边的是左是l<---->j
quick_sort(q,j+1,r);//右是j+1<----->r
}
第二种写法
void quick_sort(int q[],int l,int r)
{
if(l>=r)return;
int x = q[(l+r)/2],i= l-1,j = r+1;
while(i<j)
{
while(q[++i]<x);
while(q[--j]>x);
if(i<j)swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
归并排序
- 确定分界点 mid = (l+r)/2
- 递归left 、right 两个区间
- 归并---合二为一,借助辅助数组
void merge_sort(int q[],int l,int r)
{
if(l>=r)return;
int mid = l+r>>1;//取分界点
//运用递归
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
//归并排序
int k= 0,i = l,j= mid + 1; //i作为左区间的起点,j作为右区间的起点
while(i<=mid&&j<=r)
if(q[i]<=q[j])st[k++] = q[i++];
else st[k++] = q[j++];
while(i<=mid)st[k++] = q[i++];
while(j<=r)st[k++] = q[j++];
for(i=l,j=0;i<=r;i++,j++)q[i] = st[j];//最后再把排好的重新赋值给原数组
}
二分查找
x作为目标值
不加1的情况是------q[mid]---x-----
假如一个区间为[l,r],那么我们可以把它分割成[l,mid]和[mid+1,r];
此时更新 l = mid +1或者r = mid;
代码模板是:
注意:check(mid)该函数要自己定义
int x = l+r>>1;
While(l<r)
{
if(check(mid)) l = mid+1;
else r = mid;
}
x作为目标值:
要加1的情况是 ------x-----q[mid]-------
假如一个区间为[l,r],那么我们可以把它分割成[l,mid-1]和[mid,r];
此时更新 l = mid或者r = mid-1;
int x = l+r+1>>1;
While(l<r)
{
if(check(mid)) l = mid;
else r = mid-1;
}
欢迎大家来指导,讨论