@Ening_apps

Как слить два отсортированных массива в один?

Доброго времени суток. Дана такая задача :
Имеется два массива целых чисел: первый заполнен по возрастанию, второй - по убыванию. Объединить в порядке возрастания так, чтобы итоговый массив занял место первого массива. Дополнительных массивов не использовать.

Если бы мы сливали всё в третий массив, это было бы просто. Но в данном случае что-то у меня не получается докрутить .Вот что пока получилось.
void insert(int * arr, int N, int position, int x){
	for (int i = N-1; i >= position; i--)
	{
		*(arr+i+1)=*(arr+i);
	}
	*(arr+position-1)=x;
}
void task3(){
	int N1=5,N2=5;
	int a1[10]={1,4,9,12,54};
	int a2[]={99,17,9,8,4};
	for (int i = 0, j=N2-1; i < N1 || j>=0 ; ){
		if(a2[j]<=a1[i]){
			insert(a1,9,i,a2[j]);
			j--;
		}else i++;
	}
	for (int i = 0; i < N1+N2; i++)
	{
		printf("%d ",*(a1+i));	
	}
	printf("\n");

}


Подскажите, пожалуйста, как решить. Заранее большое спасибо за ответы!
  • Вопрос задан
  • 1790 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Надо начинать процедуру слияния с конца заполненной части первого массива и, соответственно, с начала второго. Результат заносить в конец первого массива.
Заводите индексы для движения по каждому из исходных массивов и для вставки результата. Затем сравниваете числа по индексам в исходных массивах, записываете в результат меньшее из них, сдвигаете индексы результата и записанного числа. Не забывайте проверять индексы на выход за пределы массива.
Спойлер. Лучше решить самостоятельно.
int n1 = 5, n2 = 5;
int a1[10] = {1, 4, 9, 12, 54};
int a2[] = {99, 17, 9, 8, 4};
int i1 = 0, i2 = n2-1, i = n1+n2-1;
while (i >= 0) {
  if (i1 > n1-1) {
    a1[i--] = a2[i2--];
  } else if (i2 < 0) {
    i = -1;
  } else if (a1[i1] < a2[i2]) {
    a1[i--] = a1[i1++];
  } else {
    a1[i--] = a2[i2--];
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы