問題:
在已經排序的數組中插入一個數,插入後的數組仍是有序的。
為了簡化問題,将順序規定為升序數組類型為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;
}
}
}
1.周遊數組,(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大的數時,上面的方法就沒法處理了。
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;
}
}
}