C 调整阵列中的位置以保持递增顺序
我在C语言中遇到了一个逻辑创建的问题。我要做的是: 1) 我有一个数组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”必须
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 }