问题:
在已经排序的数组中插入一个数,插入后的数组仍是有序的。
为了简化问题,将顺序规定为升序数组类型为double。
插入函数的代码如下:
//将data插入到数组arr中,使插入后仍是升序。 void insert(double data,double arr[],int len) { for (int i = 0; i < len; ++i) { if (data<arr[i]) { len ++; double *arr_t = new double [len]; for (int j = len-1; j >i; --j) arr_t[j] = arr[j-1]; //后移 arr_t[i] = data; //插入 for (int k = 0; k< i; ++k) arr_t[k] = arr[k]; delete []arr; arr = new double[len]; for(int index = 0;index <len;++index) arr[index] = arr_t[index]; delete [] arr_t; break; } } }
.遍历数组,(0到len-1),
遇到第一个比data大的数arr[i] 就将data插入到这个位置i.
插入的方法:
由于多了一个数,原来的数组大小应该+1才能装下这些数。
所以数组长度 len++;由于长度变化了,数组也就变了。于是用arr_t 来 new 一个新的数组。
将第i个元素以及i后面的元素向后移,将data插入到i位置。然后将i之前的元素复制到arr_t数组中,
此时得到了插入了data后的数组arr_t。
再将arr_t 深复制到原来的数组arr中即可。
然而这个方法有问题,当data>=arr[len-1]时,即arr数组中没有比dada大的数时,上面的方法就没法处理了。
于是对这种情况进行处理。
这种情况不需要后移,只要将data放在最后就可以。
void insert(double data, double arr[], int len) { if (data >= arr[len - 1]) { len++; double *arr_t = new double[len]; arr_t[len - 1] = data; for (int m = 0; m < len - 1; m++) arr_t[m] = arr[m]; //深复制arr_t到arr中 delete[]arr; arr = new double[len]; for (int index = 0; index <len; ++index) arr[index] = arr_t[index]; delete[] arr_t; return; } for (int i = 0; i < len; ++i) { if (data<arr[i] ) { len++; double *arr_t = new double[len]; for (int j = len - 1; j >i; --j) arr_t[j] = arr[j - 1]; //后移 arr_t[i] = data; //插入 for (int k = 0; k< i; ++k) arr_t[k] = arr[k]; //深复制arr_t到arr中 delete[]arr; arr = new double[len]; for (int index = 0; index <len; ++index) arr[index] = arr_t[index]; delete[] arr_t; break; } } }