AcWing算法基础课
1 基础算法
1.1 排序
1.1.1 快排(不稳定)平均O(nlogn) 最坏O(n)
基于分治(随意分)
假设要排序的数组为q
- 确定分界点x:q[l]或q[(l+r)/2]或q[r]或随机 随机一个数组里的数值
- 调整区间:保证左边所有的数都小于等于x,右边所有的数都大于等于x(分界点处不一定是x,x在任意位置)
- 递归处理左右两段
调整区间:
(1)暴力
开两个数组a,b
遍历数组q,<=x的放入a,>x的放入b
a放入q,b放入q
(2)优美
i指向q[0],每次向右移动一位,当i>x时,i停止移动
j指向q[n-1],每次向左移动一位,当j<x时,j停止移动
当i,j均停止移动时,交换q[i],q[j]
继续移动i,j重复上述过程,直至i,j相遇
//快排模板
void quick_sort(int q[], int l, int r)
{
if(l>=r)return; //只有一个数或者没有数直接返回
int x = q[l], i = l - 1, j = 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);
}
/*
执行完while循环后 ……ji……
若递归时取j、j+1,上面分界点就不能选r,否则会出现边界问

最低0.47元/天 解锁文章
7972





