Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调整阵列中的位置以保持递增顺序_C_Arrays_Algorithm_Sorting_Swap - Fatal编程技术网

C 调整阵列中的位置以保持递增顺序

C 调整阵列中的位置以保持递增顺序,c,arrays,algorithm,sorting,swap,C,Arrays,Algorithm,Sorting,Swap,我在C语言中遇到了一个逻辑创建的问题。我要做的是: 1) 我有一个数组a[215]={0,1,2,3,4,5}。现在我必须添加这个数组的两个最小元素,然后将新获得的元素放在同一个数组中,这样它将保持数组的递增顺序(a[],它已经被排序过数组) (2) 我还必须注意,两个最小添加元素不得再次参与排序和排序,如果它们已经添加,则必须将它们固定在其位置上一次,但通过添加新获得的元素可以再次参与排序和排序。 如: 我们加上两个最小元素0和1,0+1=1,所以“1”是通过加法得到的结果,现在这个“1”必须

我在C语言中遇到了一个逻辑创建的问题。我要做的是:

1) 我有一个数组
a[215]={0,1,2,3,4,5}
。现在我必须添加这个数组的两个最小元素,然后将新获得的元素放在同一个数组中,这样它将保持数组的递增顺序(a[],它已经被排序过数组)

(2) 我还必须注意,两个最小添加元素不得再次参与排序和排序,如果它们已经添加,则必须将它们固定在其位置上一次,但通过添加新获得的元素可以再次参与排序和排序。 如: 我们加上两个最小元素
0和1,0+1=1,所以“1”
是通过加法得到的结果,现在这个
“1”
必须定位在[]中,这样仍然应该有递增顺序。 因此:

现在我们必须再次找到最小的两个节点(请再次阅读注释(2)以便更好地理解)。我们不能再次添加
0 abnd 1
,因为他们已经参与了添加。因此,这次我们将添加1和2(这一个位于索引3,请不要与索引2的那个混淆)。我们得到1+2=3

011234345
我们再次定位3以维持不断增长的订单。 我们再次重复:对于索引4和5处的元素(因为我们已经对索引0,1和2,3处的元素进行了加法),我们将得到
3+3=6
,再次将其定位在[]

01123456
这次6大于4和5,因此它将出现在5之后,以保持递增顺序

At last we will get a[] like this:
a[ ]= [0 1 1 2 3 3  4 5 6 9 15].
所以加法在指数0,1和2,3和4,5和6,7和8,9之间,最后我们有15个,这是最后一个,所以我们停下来

现在谈谈我已经实施了多少: 我已经实现了这个加法部分,它对数组
a[]=[01 2 3 4 5]
进行加法。 并将新获得的元素放在最后一个索引(在我的代码中是dataSize,请参见
data[dataSize++]=newItem)

每次调用函数
PositionAdjustOfNewItem(数据、数据大小)将数组(也包含最后一个索引中新获取的元素)作为第一个参数,将新获取的大小作为第二个参数。下面是代码:

for(i=0;i<14;i++)
   for(j=1;j<15;j++)
   { 
      // This freq contains the given array (say a[]=[0 1 2 3 4 5] in our case and
      // it is inside the struct Array { int freq}; Array data[256]; )
      newItem.freq = data[i].freq + data[j].freq;
      data[dataSize++]=newItem;
      PositionAdjustOfNewItem(data,dataSize);  // Logic of this function I am not able to develop yet. Please help me here
      i=i+2; 
      j=j+1;
   }

for(i=0;i像这样的东西怎么样:

注意:在您的示例中,您处理的是一个包含
freq
字段的结构数组。在我的示例中,我使用的是简单的整数数组。

#include <stdio.h>
#include <string.h>

int a[] = {0,1,2,3,4,5};

int main(void) {
  int i,j;
  // Initialize a new array big enough to hold the result.
  int* array = new int[15];
  memcpy(array, a, 6*sizeof(int));
  int length=6;

  // Loop over consecutive indeces.
  for (i=0; i+1<length; i+=2) {
    // Get the sum of these two indeces.
    int sum=array[i]+array[i+1];

    // Insert the sum in the array, shifting elements where necessary.
    for (j=length-1; j>i+1; j--) { 
      if (sum >= array[j]) {
        // Insert here
        break;
      } else {
        // Shift
        array[j+1]=array[j];
      }
    }
    array[j+1]=sum;
    // We now have one more element in the array
    length++;
  }

  // Display the array.
  printf("{ ");
  for (j=0; j<length; j++) {
    printf("%d ", array[j]);
  }
  printf("}\n");
}
当您运行它时,它会产生您期望的输出

$ ./a.out
{ 0 1 1 2 3 3 4 5 6 9 15 }

你的意思是,
a[]={0123445}
?@haccks我的意思是a[215]={0,1,2,3,4,5}所以,你想添加连续的元素对,然后将结果存储在原始数组中?@Trenin元素加法,像这样,在index0,1和2,3以及4,5和6,7等等。但是我已经做过了(参见我的代码).我需要帮助准备新项目()函数。该函数将调整我的数组中新添加元素的th位置,使其仍按递增顺序。@user3206225您的代码将求和0,1,然后是0,3,然后是0,5,等等,因为您在循环结束时将j增加了两次,而不是i。如果您只需要连续的对,则只需要一个循环。请参阅下面的答案循环数组。算法的复杂度是多少?O(n)。但是,添加的元素越多,它就越接近O(1)由于元素总是添加到末尾。@user3206225我从循环中中断,然后在循环的底部插入。当
j
包含的值小于总和时,我们会中断,因此我们需要在索引
j
之后插入它。但是,当
j==I+1
时,循环将结束,(即,当它等于我们总和之一的指数时)因为我们保证大于该值,所以不需要检查它。因为循环可以提前结束,我们需要在循环后插入元素。为了避免重复代码,我只需在循环后中断并插入。@user3206225发布完整的新代码,我会看一看。说“它仍然不工作”没有给任何人太多的工作…@user3206225请记住,我发布的原始代码没有单独的PositionAdjustOfNewItem方法。因此,也许你应该从它开始,并根据需要对它进行建模。
void PositionAdjustOfNewItem(int* array, int length) {
  int newItem = array[length-1];
  for (int j=length-2; j>i+1; j--) { 
    if (sum >= array[j]) {
      // Insert here
      break;
    } else {
      // Shift
      array[j+1]=array[j];
    }
  }
  array[j+1]=sum;
}
$ ./a.out
{ 0 1 1 2 3 3 4 5 6 9 15 }