使用vector对数据进行排序(动态排序)

排序思路

头函数 algorithm 中有一个函数是 upper_bound(start,end,value)

它可以返回区间 [start,end] 中第一个大于等于 value 的值的位置

再加上 vector 中自带的插入函数 insert(space,value) 就可以对数据进行类似于二分排序的排序

时间复杂度(预期):n * logn * logn

代码如下

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

vector<int> asd;

inline int read()	//快读加速
{
	char ch=getchar();
	int res(0),status(1);
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			status=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		res=res*10+ch-'0';
		ch=getchar();
	}
	return status*res;
}

int main()
{
	int n;
	n=read();
	for(register int i=1,t;i<=n;i++)
		t=read(),
			asd.insert(upper_bound(asd.begin(),asd.end(),t),t);
	for(vector<int>::iterator it=asd.begin();it!=asd.end();it++)
		printf("%d ",*it);
	return 0;
}

很显然,vector排序在时间复杂度( n * logn * logn)上逊色于快排( n * logn),但由于其是动态的,实现了动态的排序(即每输入一个数据排序一次),在面临某一类问题前比快排这样的静排序好用

这里是快排

![这个是快排]( https://img-blog.csdnimg.cn/20191023183947871.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY5NjQzNQ==,size_16,color_FFFFFF,t_70)

这里是动态排序

![动态排序]( https://img-blog.csdnimg.cn/20191023184313304.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY5NjQzNQ==,size_16,color_FFFFFF,t_70)

例题

posted @ 2021-04-22 22:21  GlareGlimmering  阅读(912)  评论(0)    收藏  举报