一、数组的优点,缺点二、具体实现
1.接口2.完整实现代码 总结
一、数组的优点,缺点特点:数组的内存是连续的
优点
下标访问(随机访问)时间复杂度是O(1)
末尾位置增加删除元素时间复杂度是O(1)
访问元素前后相邻位置的元素非常方便
缺点
非末尾位置增加删除元素需要进行大量的数据移动O(n)
搜索的时间复杂度
无序数组-线性搜索O(n)
有序数组-二分搜索O(logn)
数组扩容消耗比较大
扩容
代码如下(示例):
//末尾增加元素 void push_back(int val); //末尾删除元素 void pop_back(); //按位置增加元素 void insert(int pos,int val) //按位置删除 void erase(int pos); //元素查询 int find(int val); //打印数据 void show()const;2.完整实现代码
代码如下(示例):
#include#include #include using namespace std; //数组实现 class Array { public: Array(int size = 10) :mCur(0), mCap(size) { mpArr = new int[mCap](); } ~Array() { delete[] mpArr; mpArr = nullptr; } public: //末尾增加元素 void push_back(int val) { if (mCur == mCap) { expand(2 * mCap); } mpArr[mCur++] = val; } //末尾删除元素 void pop_back() { if (mCur == 0) { return; } mCur--; } //按位置增加元素 void insert(int pos, int val) { if (pos<0 || pos>mCur) { return;//throw "pos invalid!"; } if (mCur == mCap) { expand(2 * mCap); } //移动元素 for (int i = mCur - 1; i >= pos; i--) { mpArr[i + 1] = mpArr[i]; } mpArr[pos] = val; mCur++; } //按位置删除 void erase(int pos) { if (pos<0 || pos>=mCur) { return; } for (int i = pos+1; i < mCur; ++i) { mpArr[i] = mpArr[i]; } mCur--; } //元素查询 int find(int val) { for (int i = 0; i < mCur; i++) { if (mpArr[i] == val) { return i; } } return -1; } //打印数据 void show()const { for (int i = 0; i < mCur; i++) { cout << mpArr[i] << " "; } cout << endl; } private: //内部数组扩容接口 void expand(int size) { int* p = new int[size]; memcpy(p, mpArr, sizeof(int) * mCap); delete[]mpArr; mpArr = p; mCap = size; } private: int* mpArr; //指向可扩容的数组内存 int mCap; //数组的容量 int mCur; //数组有效元素个数 }; int main() { Array arr; srand(time(0)); for (int i = 0; i < 10; i++) { arr.push_back(rand() % 100); } arr.show(); arr.pop_back(); arr.show(); arr.insert(0, 100); arr.show(); arr.insert(10, 200); arr.show(); int pos = arr.find(100); if (pos != -1) { arr.erase(pos); arr.show(); } }
总结
今天主要给大家手写了,线性表数组,主要应用了动态数组,对数组进行增删查。大家如果能够自己写具体实现就更好了。



