如何在给定数组的情况下按顺序插入元素?

时间:2013-11-23 23:25:26

标签: c arrays

我们假设我们在数组中有以下数字:1,3,6,15 如果用户输入某个整数(例如数字5),那么如何在上面的数组中以正确的顺序插入它,以便您可以打印以下新数组: 要使用的数组是一个可变长度的数组,我们假设用户以排序和非递减的顺序输入数组的数字,因此不需要排序,但是只是在正确的位置插入一个元素(也由用户输入)。下面我有代码,我有多远,因为我不知道用什么命令将x插入数组,我是C编程的新手。

#include <stdio.h>

int insertion_array (int n, int ary[*]); 

int main (void)
{

    int n; // size    
    int x; // The element to be inserted in the array    
    int i, j;
    printf("Enter size of array: ");

    scanf("%d", &n);
    printf("Enter the value of x: ");

    scanf("%d", &x);

    int ary[n];    
    for(i = 0; i < n; i++)
    {
        printf("Enter number %d: ", i + 1);
        scanf("%d", &ary[i]);
    } // for

    return 0;
} // main

1 个答案:

答案 0 :(得分:0)

我可以想出一个简单的O(n)算法:

  1. 使用二分搜索找到要插入的位置,比如位置5
  2. 将位置5后的所有数字移位
  3. 将位置5分配给新整数
  4. 但是有插入的O(lgn)算法,例如AVL树,RB树等等。但是要复杂得多。

    #include <stdio.h>
    #include <stdlib.h>
    
    int binsearch(int *arr, int size, int key)
    {
      int low = 0, high = size - 1;
    
      if (key > arr[high]) return size;
    
      while (high > low) {
        int mid = (low + high) / 2;
        if (arr[mid] > key) high = mid;
        else low = mid + 1;
      }
    
      return low;
    }
    
    int main()
    {
      int size = 10;
      int *arr = (int *)malloc(size * sizeof(int));
    
      int elem, len = 0;
      arr[len++] = 0;
    
      while (scanf("%d", &elem) != EOF) {
    
        int pos = binsearch(arr, len, elem);
    
        printf("%d\n", pos);
    
        int i;
        for (i = len-1; i >= pos; --i)
          arr[i+1] = arr[i];
        arr[pos] = elem;
    
        ++len;
    
        for (i = 0; i < len; ++i)
          printf("%d ", arr[i]);
        printf("\n");
      }
    
      free(arr);
    
      return 0;
    }