Array

Array

  • 存儲具備一對一邏輯關係數據的存儲順序結構
  • 數組最大的優勢:快速查詢,最好應用於索引有語義的狀況。
    在這裏插入圖片描述

插入元素

在這裏插入圖片描述

template<typename T>
bool Array<T>::add(const int index, const T& e) 
{
	if (index<0 || index>size)return false;		//判斷索引是否正確
	if (size == capacity)resize(1.5 * capacity);	//判斷空間是否足夠,不夠擴容爲當前的2倍
	for (int i = size - 1; i >= index; --i)		//從後向前循環
	{
		data[i + 1] = data[i];					//所有元素向後移一位
	}
	data[index] = e;							//插入元素	
	++size;										//數組元素的個數+1
	return true;
}

擴容與縮減

在這裏插入圖片描述

template<typename T>
void Array<T>::resize(const int newcapacity)
{
	T* newdata = new T[newcapacity];	//建立新的傳入大小數組空間
	for (int i = 0; i < size; ++i)	//把本來的數組元素放入新的數組空間
	{
		newdata[i] = data[i];
	}
	data = newdata;		//把本來的數組指向新的數組
	capacity = newcapacity;	//新的空間大小給本來的空間大小
	newdata = nullptr;	//把新數組置爲空
	delete[] newdata;	//釋放新數組
}

刪除元素

在這裏插入圖片描述

template<typename T>
T Array<T>::remove(const int index)	
{
	if (index<0 || index>size)return -1;	//判斷索引是否正確
	T ret = data[index];					//保存臨時元素
	for (int i = index + 1; i < size; ++i)	
	{
		data[i - 1] = data[i];				//從要插入的元素後一位全部元素向前移一位
	}
	--size;	//元素個數-1
	if (size == capacity / 4 && capacity / 2 != 0)	//判斷元素個數是否爲數組容量的1/4而且數組空間不爲0
	{
		resize(capacity / 2);	//調用resize傳入當前容量的一半
	}
	return ret;		//返回被刪除的元素
}

時間複雜度

在這裏插入圖片描述

均攤複雜度

在這裏插入圖片描述
在這裏插入圖片描述
  9次addLast操做,觸發resize,總共進行了17次基本操做,平均每次addLast操做,進行2次基本操做。ios

  假設capacity = n,n+1次addLast,觸發resize,總共進行2n+1次基本操做,平均每次addLast操做進行2次基本操做。數組

  這樣均攤計算時間複雜度是O(1),同理removeLast操做,均攤複雜度也爲O(1)。spa

代碼清單

Array.h
#pragma once
#include<iostream>
template<typename T>
class Array
{
public:
	//無參構造
	Array() :size(0), capacity(10)	
	{
		data = new T[10];	//默認初始化10個空間
	}
	//有參構造
	Array(int capacity) :size(0), capacity(capacity)
	{
		data = new T[capacity];
	}
	//返回元素個數
	int getSize()const;
	//返回數組容量
	int getCapacity()const;
	//返回第一個元素
	T getFirst();
	//返回最後一個元素
	T getLast();
	//判斷是否爲空
	bool isEmpty()const;
	//插入元素
	bool add(const int index, const T& e);
	//頭插
	bool addFirst(const T& e);
	//尾插
	bool addLast(const T& e);
	//查找數組中是否存在該元素
	bool contains(const T& e)const;
	//查找數組中元素的索引,不存在返回-1
	int find(const T& e)const; 
	//刪除索引元素,返回刪除元素
	T remove(const int index);
	//刪除頭,返回頭
	T removeFirst();
	//刪除尾,返回尾
	T removeLast();
	//設置索引值
	bool set(const int index, const T& e);
	//獲取索引值
	T get(const int index)const;
	//打印元素
	void print()const;
	//釋放空間
	~Array();
private:
	void resize(const int newcapacity);	//從新分配空間
	T* data;
	int size;	//數組大小
	int capacity;	//數組容量
};

template<typename T>
int Array<T>::getSize() const
{
	return size;	//返回數組長度	
}

template<typename T>
int Array<T>::getCapacity() const
{
	return capacity;	//返回數組容量
}

template<typename T>
inline T Array<T>::getFirst()
{
	return get(0);
}

template<typename T>
inline T Array<T>::getLast()
{
	return get(size - 1);
}

template<typename T>
bool Array<T>::isEmpty() const
{
	return size == 0;	//判斷是否爲空,
}

template<typename T>
bool Array<T>::add(const int index, const T& e) 
{
	if (index<0 || index>size)return false;		//判斷索引是否正確
	if (size == capacity)resize(2 * capacity);	//判斷空間是否足夠,不夠擴容爲當前的2倍
	for (int i = size - 1; i >= index; --i)		//從後向前循環
	{
		data[i + 1] = data[i];					//所有元素向後移一位
	}
	data[index] = e;							//插入元素	
	++size;										//數組元素的個數+1
	return true;
}

template<typename T>
bool Array<T>::addFirst(const T& e) 
{
	return add(0, e);	//調用add從0號索引元素插入
}

template<typename T>
bool Array<T>::addLast(const T& e)
{
	return add(size, e);	//調用add從size號索引元素插入
}

template<typename T>
bool Array<T>::contains(const T& e) const
{
	for (int i = 0; i < size; ++i)	//遍歷是否有查找的元素
	{
		if (data[i] == e)return true;	
	}
	return false;
}

template<typename T>
int Array<T>::find(const T& e) const
{
	for (int i = 0; i < size; ++i)	//遍歷是否有查找的元素,有返回索引,無返回-1
	{
		if (data[i] == e)return i;	
	}
	return -1;
}

template<typename T>
T Array<T>::remove(const int index)	
{
	if (index<0 || index>size)return -1;	//判斷索引是否正確
	T ret = data[index];					//保存臨時元素
	for (int i = index + 1; i < size; ++i)	
	{
		data[i - 1] = data[i];				//從要插入的元素後一位全部元素向前移一位
	}
	--size;	//元素個數-1
	if (size == capacity / 4 && capacity / 2 != 0)	//判斷元素個數是否爲數組容量的1/4而且數組空間不爲0
	{
		resize(capacity / 2);	//調用resize傳入當前容量的一半
	}
	return ret;		//返回被刪除的元素
}

template<typename T>
T Array<T>::removeFirst()		
{
	return remove(0);		//刪除0號索引元素
}

template<typename T>
T Array<T>::removeLast() 
{
	return remove(size - 1);	//刪除size-1號索引元素
}

template<typename T>
bool Array<T>::set(const int index, const T& e)
{
	if (index<0 || index>size)return false;	//判斷索引元素是否正確
	data[index] = e;						//設置索引的新元素
	return true;
}

template<typename T>
T Array<T>::get(const int index) const
{
	if (index<0 || index>size)return -1;	//判斷索引元素是否正確
	return data[index];						//返回索引元素
}

template<typename T>
void Array<T>::print() const
{
	std::cout << "Array:size = " << size << "	Array:capacity = " << capacity << std::endl;
	std::cout << "Array:data = " << "[";
	for (int i = 0; i < size; ++i)
	{
		std::cout << data[i] << ",";
	}
	std::cout << "]" << std::endl;
}

template<typename T>
Array<T>::~Array()
{
	delete[] data;	//釋放空間
	data = nullptr;
}

template<typename T>
void Array<T>::resize(const int newcapacity)
{
	T* newdata = new T[newcapacity];	//建立新的傳入大小數組空間
	for (int i = 0; i < size; ++i)	//把本來的數組元素放入新的數組空間
	{
		newdata[i] = data[i];
	}
	data = newdata;		//把本來的數組指向新的數組
	capacity = newcapacity;	//新的空間大小給本來的空間大小
	newdata = nullptr;	//把新數組置爲空
	delete[] newdata;	//釋放新數組
}
main.cpp
#include"Array.h"
using namespace std;

int main()
{
	Array<int>* arr = new Array<int>(10);
	for (int i = 0; i < 10; ++i)
	{
		arr->addLast(i);
	}
	arr->print();
	cout << endl;
	cout << "arr->add(1, 1)" << arr->add(1, 1) << endl;
	arr->print();
	cout << endl;
	cout << "arr->addLast(0) " << arr->addLast(0) << endl;
	arr->print();
	cout << endl;
	cout << "arr->addFirst(0)" << arr->addFirst(0) << endl;
	arr->print();
	cout << endl;
	cout << "arr->contains(0)" << arr->contains(0) << endl;
	arr->print();
	cout << endl;
	cout << "arr->find(0)" << arr->find(0) << endl;
	arr->print();
	cout << endl;
	cout << "arr->get(1)" << arr->get(1) << endl;
	arr->print();
	cout << endl;
	cout << "arr->set(0, 5)" << arr->set(0, 5) << endl;
	arr->print();
	cout << endl;
	cout << "arr->getCapacity()" << arr->getCapacity() << endl;
	arr->print();
	cout << endl;
	cout << "arr->getSize()" << arr->getSize() << endl;
	arr->print();
	cout << endl;
	cout << "arr->isEmpty()" << arr->isEmpty() << endl;
	arr->print();
	cout << endl;
	cout << "arr->remove(1)" << arr->remove(1) << endl;
	arr->print();
	cout << endl;
	cout << "arr->removeFirst()" << arr->removeFirst() << endl;
	arr->print();
	cout << endl;
	cout << "arr->removeLast()" << arr->removeLast() << endl;
	arr->print();
	cout << endl;
	cout << "arr->getFirst" << arr->getFirst() << endl;
	arr->print();
	cout << endl;
	cout << "arr->getLast" << arr->getLast() << endl;
	arr->print();

	delete arr;
	return 0;
}
相關文章
相關標籤/搜索