AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

Day01算法学习

作者: 作者的头像   acwing_87018 ,  2024-11-28 23:09:02 ,  所有人可见 ,  阅读 5


0


今天学习了y总的两个排序模板,在此写一下算是回顾
第一次写,不太清楚,如果有错误也麻烦大家帮忙指正,感谢

首先是快速排序
快速排序的思想如下:
1:找到划分点,即与后面比较的数
可以是q[l],q[(l+r)/2],q[r],也可以是一个随机数
但是注意
划分点的选择是很重要的
如果你的划分点选择了q[l],那么对应的排序区间就应当是quick(q,l,j)和quick(q,j+1,r)
越界例子如下:
如果在我们的划分点选择了q[l]的情况下,选择将j替换成i-1的话,
那么假设此时只有两个数1,2
划分点为q[l]=1,i并没有小于q[l],停止在q[0]
而r=2>q[l],向前移动一位,此时q[l]和q[r]重合,即达到了l>=r将函数返回的条件
区间[l,i-1]此时i=0,发生越界问题
2:将区间划分成左右两部分(核心)
int i=l-1;int j=r+1;int x=q[l];
while(i[HTML_REMOVED]x);
if(i<j)
swap(q[i],q[j]);
}
如此我们便将数组根据划分点划分成了两个有序的小数组
3:递归调用quick划分两个小数组
quick(q,l,j);
quick(q,j+1,r);

然后是合并排序
合并排序和快速排序操作相反,先找到划分点,然后递归调用左右半边,使得左右半边有序
然后合并两个半边(核心),需要定义一个temp数组来接受合并后的值
1:划分点默认是中间值
int mid=q[(l+r)/2];
2:递归调用自身
merge(q,l,mid);
merge(q,mid+1,r);
3:合并
int i=l;
int j=mid+1;
int k=0;
while(i<=mid&&j<=r)
{
if(q[i]<q[j])
temp[k]=q[i];
else
temp[k
]=q[j];

if(i<=mid)
temp[k++]=q[i];//处理完还剩下左半部分
if(j<=r)
temp[k++]=q[j];//处理完还剩下右半部分

}
4:将temp数组里面的内容放回到原来数组q[]中
for(i=l,k=0;i<=r;i,k)
q[i]=temp[k];

2 评论


用户头像
acwing_87018   2024-12-01 13:36         踩      回复

if改为while


用户头像
acwing_87018   2024-11-28 23:13         踩      回复

下划线都有++,不知道笔记是咋用的


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息