代码来源:《数据结构(c++语言版)(第三版)》,邓俊辉编著,ISBN: 978-7-302-33064-6
有序向量中的元素不仅按线性次序排放,而且数值大小也按次序单调分布。这给后续的操作带来很大的便利。虽然对向量排序sort()会花费一定的时间,但是从总体上看,转化成有序向量后,操作会简化很多。这一时间的花费是值得的。
1.有序性甄别
向量有序的比较原理是:对向量中任意两个相邻元素进行比较,如果其未按要求排列,则称其为逆序对。如果向量中没有类似的逆序对,则向量有序。
template <typename T> int Vector<T>::disordered() const { //返回向量中逆序相邻元素对的总数
int n = 0; //计数器
for (int i = 1; i < _size; ++i) //逐一检查_size - 1对相邻元素
if(_elem[i-1] > _elem[i]) ++n; //逆序则计数
return n; //向量有序当且仅当n = 0
}
2.唯一化
为了实现唯一化,最容易想到的方法就是从第一项元素开始,逐个扫描后继元素,若相同则删除后继元素。
template <typename T> int Vector<T>::uniquify(){ //有序向量重复元素剔除算法(低效版)
int oldSize = _size; int i = 1; //当前比对元素的秩,起始于首元素
while (i < _size) //从前向后,逐一比对各对相邻元素
_elem[i - 1] == _elem[i] ? remove(i) : ++i; //若雷同,则删除后者;否则,转至后一元素
return oldSize - _size; //向量规模变化量,即被删除的元素总数
}