我想将一个元素插入到排序列表中维护的正确位置。 我为阵列分配了2 * n的大小,其余用999填充,因为它们目前没有使用。
ordered_insert(int number,int array[],int size){
int i=0;
int temp1,temp2,index;
while(eleman>array[i]){
i++;}
//push the rest to right by one
index=i;
if(i<size){
temp1=array[i];
temp2= array[i+1];
array[i+1]=temp1;
array[i+2]=temp2;
i++;
}
array[index]=number;
}
我无法弄清楚如何覆盖999s或者有更好的方法吗?
答案 0 :(得分:2)
为了将所有后面的数组元素向前移动一步,您必须向后遍历数组,这样就不会覆盖元素。
获得索引后,
int i = size;
while ( i > index ) {
array[i] = array[i-1];
i--;
}
array[i] = number;
size++;
答案 1 :(得分:1)
你可以
memmove(&array[i+1], &array[i], (size - i) * sizeof array[i]);
编辑:
不需要999
技巧;只记录size
中已使用元素的数量(并添加适当的边界检查)。
答案 2 :(得分:0)
要推送数组元素的其余部分,您应该使用循环。 只是做车,你应该从最后一个元素开始推动,否则你将为其余元素分配相同的值
int i=size-1; // Not i=size (this is the size of the array not the last index)
while (i>index){
array[i] = array[i-1];
i--;
}
array[i] = number;
关于使用999分配未使用的元素它不是必需的,只需定义一个键来记住最后一个元素并使用它而不是大小,然后在插入新元素时检查你是否达到了数组的大小。
答案 3 :(得分:0)
// 1. initialise i (the 'hole' index) to the last element in the array
// 2. if the preceeding array element is larger than the newValue
// 3. move the preceeding element into the 'hole' at i, moving the hole up a position
// 4. reverse through the array
// 5. else put the newValue into the hole and we're done
i = ARRAY_SIZE-1;
while (i>0 && array[i-1]>newValue) {
array[i] = array[i-1];
i--;
}
array[i] = newValue;
答案 4 :(得分:0)
试试这个:-
#include<stdio.h>
void insert(int a[], int size, int element)
{size++;
int flag=0;
for(int i=0;i<size;i++)
{
if(a[i]>element)
{flag++;
for(int j=size; j>=i; j--)
a[j] = a[j-1];
a[i] = element;
break;
}
}
if (flag == 0)
a[size-1] = element;
for(int i=0;i<size;i++)
printf(" %d", a[i]);
}
int main()
{
printf("Insertion of elements in array \n");
int arr[100], size, element;
printf("Enter the size of array:- ");
scanf("%d",&size);
printf("\nEnter the array(Sorted Array!):- ");
for(int i=0;i<size;i++)
{
scanf("%d",&arr[i]);
}
printf("\nEnter element you want to insert:- ");
scanf("%d", &element);
insert(arr, size, element);
return 0;
}