一、基础算法
排序
快速排序
思想:(分治)
1、确定分界点:q[l],q[(l+r)/2],q[r]
,任意;
2*、调整区间
3、递归处理左右两段
第二步的实现:
暴力
- 开a[],b[]两个数组;
- 扫描
q[l,r]
if (q[i]<=x)
q[i]--->a[]
if(q[i]>=x)
q[i]-->b[]
3、先把 a[]-->q[]
,再把b[]--->q[]
.
优美
1、q[i]>x,q[j]<x swap(q[i],q[j])
2、条件: i<j
伪代码
void quick_sort(int q[],int l,int r)
// 出口
if(l>=r)
return ;
// 1、确定分界点
int x=q[l],i=l-1,j=r+1;
// 2、调整区间
while(i<j){
do i++ while(q[i]<x);
do j-- while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
// 3、递归处理两端
quick_sort(q,l,j);
quick_sort(q,j+1,r);
题目练习:
链接: 快速排序
归并排序
思想:
1、确定分界点:mid=(l+r)/2(这里有2种情况)
2、递归排序左右两边
3*、归并 合二为一,需要一个临时数组保存
伪代码:
int temp[N];
void merge_sort(int q[],int l,int r){
//出口
if(l>=r) return ;
// 1、确定分界点
int mid =l+r>>1,k=0,i=l,j=mid+1;
// 2、递归排序左右两边
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
// 合二为一
while(i<=mid&&j<=r)
if(q[i]<q[j]) temp[k++]=q[i++];
else temp[k++]=q[j++];
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
//把一段排好序的,再放回去
for(int i=l,k=0;i<=r;i++,k++){
q[i]=q[k];
}
练习题目
链接: 归并排序