(1)快速排序——分治
注意的是,边界问题特别多,需要背诵一定的模板。先说说该排序的具体思路。
1. 在数组中选一个基准数(通常为数组第一个)
2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边
3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序
具体思路参考博客:https://blog.csdn.net/elma_tww/article/details/86164674?biz_id=102&utm_term=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-86164674&spm=1018.2118.3001.4187
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)
{
int x = q[i];
q[i] = q[j];
q[j] = x;
}
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!
(2)归并排序——把有序的两个数组归并成一个数组
原理是双指针比较,通过两组有序数组中找出最小值,得到整体的最小值
详细原理请看:https://blog.csdn.net/cqx13763055264/article/details/81701419?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159980784419725222436885%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159980784419725222436885&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-81701419.pc_ecpm_v3_pc_rank_v3&utm_term=%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F&spm=1018.2118.3001.4187
const int N = 1e6 + 10;
int q[N],tmp[N];
using namespace std;
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 k = 0, i = l, j = mid + 1;
while (i <= mid && 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];
}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!
(3)整数二分——主要解决的问题是一段数据中可以分成两部分,并且区分点不重合
注意的是,注意边界,当 r = mid 时, mid不用加一,当 l = mid 时,mid 要加一。
bool check(int x) {}
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!