快排(分治)
将小于给定值num的数放在数 组的左边,大于num的数放在数组的右边,定值num不能在数组中存在
while(i<j){ do i++;while(a[i]<num); do j--;while(a[j]>num); if(i<j) swap(a[i],a[j]);}
- 确定分界点 q[l+r>>1]
- 调整区间 小于分界点的在左边, 大于分界点的在右边
- 递归处理左右两段
模板
void quick_sort(int q[],int l,int r){ if(l>=r) return; int i = l-1,j = r+1, x = q[l+r>>1]; 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),quick_sort(q,j+1,r);}
归并排序
- 确定分界点
- 递归排序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 i = l,j = mid+1,k = 0; while(i<=mid and j<=r) { if(q[i]<q[j]) tmp[k++] = q[i++]; else tmp[k++] = q[j++]; } while(i<=mid) tmp[k++] = q[i++]; while(j<=r) tmp[k++] = q[j++]; for(i = l,j = 0;i<=r;i++,j++) q[i] = tmp[j];}