
基础算法
向死而生zzz
这个作者很懒,什么都没留下…
展开
-
逆序对的数量
求数组中逆序对的数量思想代码模板#include<iostream>using namespace std;typedef long long LL;const int N = 100010;int n;int q[N], tmp[N];LL merge_sort_inverse(int q[], int l, int r){ if (l >= r) return 0; int mid = l + r >> 1; LL re原创 2021-03-25 20:56:38 · 157 阅读 · 0 评论 -
归并排序代码模板
归并排序思想归并使用双指针思想,两个指针分别指向两个有序区间的最小,并进行比较,找到最小的那个取出,并使指针右移并继续比较,直到其中一个指针到区间的末尾(两个值相同时,一般取第一个区间的数组,因此归并排序是稳定的,稳定是指排序得到的顺序不变,不是指时间稳定)时间复杂度lg(n)代码模板#include<iostream>using namespace std;const int N = 1000010;int n;int q[N], tmp[N];void me原创 2021-03-25 15:42:57 · 186 阅读 · 1 评论 -
查找第k个数
查找第k个数题目描述给定一个长度为n的整数列,以及一个整数k,用快速选择算法求出数列第k小的数解题思路使用快排的思想,在快排递归步骤进行判断,只递归k所在区间,时间复杂度为2n代码模板#include <iostream>using namespace std;const int N = 100010;int p[N], n, k;int quick_sort(int l, int r, int k){ if(l == r) retu原创 2020-11-09 16:32:32 · 329 阅读 · 0 评论 -
快速排序代码模板
快速排序(分治的思想)三个步骤确定分界点调整区间(最难的部分)暴力的方法双指针方法递归处理左右两边三个步骤快速排序主要包括三个步骤:确定分界点、调整区间。确定分界点可以使用左边界(q[l]),中间值(q[(l+r)/2]),有边界(q[r]),随机调整区间(最难的部分)把整个区间一分为二,左半边<=x,右半边暴力的方法新开辟两个数组空间,遍历数组,分别将满足这两个条件的数值分别存储到两个数组双指针方法利用双指针分别从数组首尾往数组中间进行移动,满足左指针指向内容<=x,原创 2020-11-09 10:44:06 · 415 阅读 · 0 评论