最为基本的线性结构统称为序列,根据其中数据项的逻辑次序与其物理存储地址的对应关系不同,又可进一步地将序列区分为向量(vector)和列表(list)。
在向量中,所有数据项的物理存放位置与其逻辑次序完全吻合,此时的逻辑次序也称为秩(rank)。
在列表中,逻辑上相邻的数据项在物理上未必相邻,而是采用间接定址的方式通过封装后的位置(position)相互引用。
Vector模板类
/*************************************************************************
> File Name: vector.h
> Author: amoscykl
> Mail: amoscykl@163.com
> Created Time: 2018年07月02日 星期一 20时51分45秒
************************************************************************/
typedef int Rank; //秩
#define DEFAULT_CAPACITY 3 //默认的初始容量
template <typename T> class Vector { //向量模板类
protected:
Rank _size; int _capacity; T* _elem; //规模,容量,数据区
void copyFrom(T const* A, Rank lo, Rank hi); //复制数据区间A[lo,hi]
void expand(); //空间不足时扩容
void shrink(); //装填因子过小时压缩
bool bubble (Rank lo, Rank hi); //扫描交换
void bubbleSort( Rank lo, Rank hi); //起泡排序算法
Rank max(Rank lo, Rank hi); //选取最大元素
void selectionSort(Rank lo, Rank hi); //选取最大元素
void merge(Rank lo, Rank mi, Rank hi); //归并算法
void mergeSort(Rank lo, Rank hi); //归并排序算法
Rank partition(Rank lo, Rank hi); //轴点构造算法
void quickSort(Rank lo, Rank hi); //快速排序算法
void heapSort(Rank lo, Rank hi); //堆排序
public:
// 构造函数
Vector( int c = DEFAULT_CAPACITY, int s = 0, T v = 0) //容量为c、规模为s、所有元素初始化为v
{ _elem = new T[_capacity = c]; for( _size = 0; _size < s; _elem[_size++] = v); } // s <= c
/*动态数组*/
Vector( T const* A, Rank n) { copyFrom(A,0,n); } //数组整体复制
Vector( T const* A, Rank lo, Rank hi) { copyFrom(A,lo,hi); } //区间
Vector( Vector<T> const& V) { copyFrom( V._elem, 0, V._size); } //向量整体复制
Vector( Vector<T> const& V, Rank lo, Rank hi) { copyFrom( V._elem, lo, hi); } //区间
//析构函数
~Vector() { delete [] __elem};
//只读访问接口
Rank size() const { return _size; } //规模
bool empty() const { return !_size; } //判空
int disordered() const; //判断向量是否已排序
Rank find ( T const& e ) const { return find (e,0,_size); } //无序向量整体查找
Rank find ( T const& e, Rank lo, Rank hi) const; //无序向量区间查找
Rank search ( T const& e) const //有序向量整体查找
{ return ( 0 >= _size ) ? -1 : search(e,0,_size); }
Rank search (T const& e, Rank lo, Rank h