前言
作者学习后想总结检验自己
文章目录
前言
配套acwing算法基础课程
第一单元
1.快速排序。
思路:
(0)规定结束条件
(1)分区间,一般是l+r/2;(分治)
(2)双指针,一个从最左边开始,一个从最右边开始
在左边的若是指到一个小于分界点的停下来,右边的指到一个大于分界点的停下来
两个指针的值交换,继续前进
(3.)递归进行
ps:这里的分界点是数组中间点的值,不是中间点这个坐标!!!
代码:
# include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int q[N];
void quick_sort(int *a,int l,int r)
{
if(l >= r ) return;
int i = l-1;
int j = r+1;
int mid = a[l+r >> 1];//是中间坐标这个值
while(i < j)
{
do(i++);while(a[i] < mid);//若想降序排序,这将这两行的大小于号交换
do(j--);while(a[j] > mid);
if(i < j)swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main(void)
{
int n;
cin >> n;
for(int i =0;i < n;i++)
cin >> q[i];
quick_sort(q,0,n-1);
for(int i = 0;i < n;i++)
cout << q[i] <<' ';
return 0;
}
2.归并排序
(1.) 分治--以区间的中点坐标为分界线;
(2)先递归分治两边再排序
(3.)归并--把两个有序的数组合并成一个数组
画图解释归并
运用双指针
两个有序的数组,每个指针指向每个数组最小值,两个最小值比较
将两个指针的值较小的那个放入答案数组,然后这个指针向后走一位,再次比较
若是有一个指针走到头,则把另一个指针的剩余部分接到答案数组里
最后把答案数组赋值回原来数组
代码
# include <iostream>
using namespace std;
const int N = 1000010;
int q[N],tmp[N];
int n;
void mergr_sort(int *q,int l,int r)
{