在C中向数组添加元素,同时保持升序

时间:2016-09-22 03:05:28

标签: c arrays algorithm

我在C中需要一个addArray函数,它将给定元素添加到给定数组中,确保每个元素都插入到数组中的正确位置,以便整数的顺序按升序排列。

  • Prototype int addArray(int * arr,int sizeofArray,int numToAdd)
  • 找到要插入的正确索引。
  • 移动其他元素进行调整。
  • 将新元素存储在正确的索引
  • 返回数组的大小。

我可以获得此功能的任何帮助。

int addToArray(int *array, int size, int selectedNum){
    //printf("Selected number is %d \n", selectedNum);
    int indexToInsert=0;
    if(size==0){
        array[indexToInsert]=selectedNum;
        size=1;
        indexToInsert++;
        return size;
    }
    else{

        for(int i=size; i<=1; i--){
            if(selectedNum>array[i]){
                indexToInsert=i-1;
                break;
            }
            else{
                }
        }
        if(indexToInsert>0){
            for(int j=size-1; j>indexToInsert; j--){
                array[j+1]=array[j];
            }
            array[indexToInsert]=selectedNum;
            size = size+1;
            printf("Size incremented to %d\n", size);
            return size;
}

要求是:不要简单地将元素添加到数组并进行排序。它必须存储在正确的索引中。这就是我对此功能的要求。它工作不正常。主程序提示用户,直到输入负数,并且每个正数都按升序添加到数组中。

1 个答案:

答案 0 :(得分:2)

当在中间或任何随机位置有大量插入操作时,数组的选择不是很明智,因为将数组的其余部分(插入后)元素移动+1位置将非常昂贵的事件。

更好的方法:使用multimap或priority-queue,默认情况下以升序存储值,允许重复值作为键。然后从映射的开始到结束迭代以将键存储在数组中。

TC: O(NlogN) for insertions + O(N) for last traversal of map => O(NlogN).

如果您仍想使用数组而没有其他数据结构,请在执行插入操作时使用binary search mechanism

TC: O(NlogN) for insertions + O(N^2) for moving => O(N^2).
Worst case scenario: when the input stream is in descending order, and 
                     the final array is expected to be in ascending order.