// 无序数组class List {// 1.创建空的数组 指定sizeconstructor() {this.arr = new Array(10);this.size = 10;this.length = 0;this.realloc = () => {let new_arr = null;// 扩大if(this.length === this.size) {// 增加空间 原来数据拷贝到新数据this.size = this.size*2;new_arr = new Array(this.size);} else if(this.length < (this.size/4)) {// 判断是否需要缩小this.size = Math.floor(this.size/2);new_arr = new Array(this.size);}if(new_arr) {for(let i = 0; i < this.length; i++){new_arr[i] = this.arr[i]}delete this.arr;this.arr = new_arr;}};this.checkRange= (index) => {if(typeof index !== 'number' || index < 0 || index >= this.length) {throw new RangeError();}}}getItem(index){this.checkRange(index);return this.arr[index];}setItem(index, value) {this.checkRange(index);return this.arr[index] = value;}// 添加append(value){this.arr[this.length] = value;this.length++;// 如果超出 扩展空间this.realloc();}// 插入insert(value, pointIndex) {if(pointIndex < 0 || pointIndex > this.length) {throw new RangeError();} else if (pointIndex === this.length) {append(value);} else {// 1.index的数据都向后移动一位for(let j = this.length; j > pointIndex; j --) {this.arr[j] = this.arr[j-1];}// 2.新的数据放到 index 位置上this.arr[pointIndex] = value;this.length++;// 如果超出 扩展空间this.realloc();}}// 删除某一项delete(index) {this.checkRange(index);// 1.index的数据都向前移动一位for(let j = index; j < this.length -1; j ++) {this.arr[j] = this.arr[j+1];}this.length--;this.realloc();}// 有序的数组 二分法查找 适用于搜索性能更高search(value) {let s = 0;let e = this.arr.length - 1;while(s <= e) {let center = Math.floor((s+e)/2);if(value === this.arr[center]) {return center;} else if(value < this.arr[center]) {e = center - 1;} else {s = center + 1;}}return -1;}}// 有序数组 先继承无序数组的属性和方法class OrderList extends List{constructor() {// 继承父级super();this.adjusted = (index) => {// 调整顺序// 往前调整 我比前面小if(index > 0 && this.arr[index] < this.arr[index-1]){for (let i = index; i > 0; i --) {if(this.arr[i] < this.arr[i-1]) {let temp = this.arr[i-1];this.arr[i-1] = this.arr[i];this.arr[i] = temp;} else {break;}}} else if(index < (this.length - 1) && this.arr[index] > this.arr[index+1]) {// 往后调整 我比后面的大for (let i = index; i < (this.length - 1); i ++) {if(this.arr[i] > this.arr[i+1]) {let temp = this.arr[i+1];this.arr[i+1] = this.arr[i];this.arr[i] = temp;} else {break;}}}}}setItem(index, value) {// 先调用父级方法 然后在调用自己的方法super.setItem(index, value);this.adjusted(index);}append(value){// 先调用父级方法 然后在调用自己的方法super.append(value);this.adjusted(this.length -1);}insert(value, index){// 先调用父级方法 然后在调用自己的方法super.insert(value, index);this.adjusted(index);}}const list = new OrderList();list.append(1);list.append(9);list.append(5);list.append(2);list.append(4);list.insert(2, 1);console.log(list);
