使用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),但由于其是动态的,实现了动态的排序(即每输入一个数据排序一次),在面临某一类问题前比快排这样的静排序好用

这里是快排

这个是快排

这里是动态排序

动态排序

例题


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM