1.偷偷转载大佬对于考点的分布及汇总整理
链接:https://www.cnblogs.com/jlyg/p/7525244.html
2.根据考点复习的算法。
(1)快排
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
int a[maxn],n;
void quicksort(int left,int right)
{
if(left>right)
return;
int temp = a[left];
int i = left;
int j = right;
while(i!=j)
{
while(a[j]>=temp&&i<j)// 1
j--;
while(a[i]<=temp&&i<j)// 2
i++;
if(i<j) //1 2 顺序不能换
swap(a[i],a[j]);
}
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i ++)
scanf("%d",&a[i]);
quicksort(0,n-1);
for(int i = 0; i < n; i ++)
printf("%d ",a[i]);
}
(2)插入排序
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
int n,a[maxn];
void insertsort()
{
for(int i = 0; i < n; i ++)
{
int temp = a[i];
int j = i - 1;
while(j>=0&&a[j]>temp)
{
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
}
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i ++)
scanf("%d",&a[i]);
insertsort();
for(int i = 0; i < n; i ++)
printf("%d ",a[i]);
}
3.dirjstra
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f
int map[maxn][maxn],dis[maxn],vis[maxn],n,m;
void dijkastra(int s)//s为起点
{
for(int i = 1; i < n; i ++)
dis[i] = inf;
dis[s] = 0;
for(int i = 0 ; i < n ; i ++)
{
int min,mindis = inf;
for(int j = 1; j <= n; j ++)
{
if(dis[j]<mindis&&!vis[j])
{
mindis = dis[j];
min = j;
}
}
vis[min] = 1;
for(int j = 1; j <= n; j ++)
if(mindis+map[min][j]<dis[j]&&map[min][j]!=inf&&!vis[j])
dis[j] = mindis + map[min][j];
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 0; i < m; i ++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
}
int s,e;
scanf("%d %d",&s,&e);
dijkastra(s);
}
4.floyd
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f
int map[maxn][maxn],dis[maxn][maxn];
int n,m;
void init()
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
map[i][j] = inf;
if(i==j)
map[i][j] = 0;
}
}
void floyd()
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
dis[i][j] = map[i][j];
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
int main()
{
return 0;
}
5.并查集
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1005
int f[maxn],n,m;
void init()
{
for(int i = 0; i < n; i ++)
f[i] = i;
}
int find(int x)
{
if(x!=f[x])
f[x] = find(f[x]);
return f[x];
}
void merge(int x,int y)
{
int fa = find(x);
int fb = find(y);
if(fa!=fb)
f[fa] = fb;
}
int main()
{
init();
scanf("%d %d",&n,&m);
int counts = 0;
for(int i = 0; i < m; i ++)
{
int a,b;
scanf("%d %d",&a,&b);
if(find(a)!=find(b))
{
merge(a,b);
}
}
}
6.avl
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct TreeNode
{
int value;
TreeNode *left;
TreeNode *right;
int height;
TreeNode(int v):value(v),left(NULL),right(NULL),height(0){}
};
typedef struct TreeNode* avltree;
int getHeight(TreeNode *t)
{
if(t == NULL) return -1;
else return t->height;
}
//左左
TreeNode *SingleRotateLeft(TreeNode *t2)
{
TreeNode *t1;
t1 = t2->left;
t2->left = t1->right;
t1->right = t2;
t2->height = max(getHeight(t2->left),getHeight(t2->right)) + 1;
t1->height = max(getHeight(t1->left),getHeight(t1->right)) + 1;
return t1;
}
//右右
TreeNode *SingleRotateRight(TreeNode *t2)
{
TreeNode *t1;
t1 = t2->right;
t2->right = t1->left;
t1->left = t2;
t2->height = max(getHeight(t2->left),getHeight(t2->right)) + 1;
t1->height = max(getHeight(t1->left),getHeight(t1->right)) + 1;
return t1;
}
//左右
TreeNode * DoubleRotateLR(TreeNode *t3)
{
t3->left = SingleRotateRight(t3->left);
return SingleRotateLeft(t3);
}
//右左
TreeNode * DoubleRotateRL(TreeNode *t3)
{
t3->right = SingleRotateLeft(t3->right);
return SingleRotateRight(t3);
}
TreeNode* Insert(int v, TreeNode *root)
{
if(root == NULL)
{
return new TreeNode(v);
}
if(v > root->value) //节点插入在右子树中
{
root->right = Insert(v,root->right);
if(getHeight(root->left)-getHeight(root->right)==2||getHeight(root->left)-getHeight(root->right)==-2){
if(v > root->right->value)
root = SingleRotateRight(root);
else
root = DoubleRotateRL(root);
}
}else{
root->left = Insert(v,root->left);
if(getHeight(root->left)-getHeight(root->right)==2||getHeight(root->left)-getHeight(root->right)==-2){
if(v < root->left->value)
root = SingleRotateLeft(root);
else
root = DoubleRotateLR(root);
}
}
root->height = max(getHeight(root->left),getHeight(root->right)) + 1;
return root;
}
int main()
{
int n;
scanf("%d",&n);
avltree tree = NULL;
for(int i = 0; i < n; i ++)
{
int x;
scanf("%d",&x);
tree = Insert(x,tree);
}
printf("%d",tree->value);
}