天天看點

C++數組中插入元素。

問題:

在已經排序的數組中插入一個數,插入後的數組仍是有序的。

為了簡化問題,将順序規定為升序數組類型為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;
    }
  }
}