dijkstra

https://www.bilibili.com/video/BV1QK411V7V4/?spm_id_from=333.788.videocard.0

归并排序

https://www.bilibili.com/video/BV1xW411Y7gY/?spm_id_from=trigger_reload

who is in the middle

#include<bits/stdc++.h>
using namespace std;
int a[100001],r[100001];
void mergesort(int s,int t) 
{
	int m,i,j,k;
	if(s==t)
		return ;
	m=(s+t)/2;
	mergesort(s,m);
	mergesort(m+1,t);
	i=s;
	j=m+1;
	k=s;
	while(i<=m&&j<=t) 
	{
		if(a[i]<=a[j]) 
		{
			r[k]=a[i];
			i++;
			k++;
		} 
		else 
		{
			r[k]=a[j];
			j++;
			k++;
		}
	}
	while(i<=m) {
		r[k]=a[i];
		i++;
		k++;
	}
	while(j<=t) {
		r[k]=a[j];
		j++;
		k++;
	}
	for(int i=s; i<=t; i++)
		a[i]=r[i];
}
int main() 
{
	int n,i;
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
	mergesort(1,n);
	printf("%d",a[(n+1)/2]);
}

  可用快速排序做到O(N)

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<utility>
using namespace std;
const int maxN=2e6+10;
int n,a[maxN],k;
int find(int l,int r,int k) 
{
	if(l==r)
		return a[l];
	//int t=a[rand()%(r-l+1)+l];
    int t=a[(l+r)/2];
	int i=l,j=r;
	while(i<=j) 
	{
		while(a[i]<t)i++;
		while(a[j]>t)j--;
		if(i<=j) 
		{
			swap(a[i],a[j]);
			i++;
			j--;
		}
	}
	if(k<=j-l+1)
		return find(l,j,k);
	else if(k>i-l)
		return find(i,r,k-(i-l));
	else
		return t;
}
int main() 
{
	cin>>n;
	k=(1+n)/2;
	for(int i=1; i<=n; ++i)
		cin>>a[i];
	srand(10000);
	cout<<find(1,n,k)<<endl;
	return 0;
}