2012-01-08 2 views
1
/*Program to merge to arrays using pointers in descending order, when the first array is in ascending order 

and the second array is in descending order*/ 

#include<iostream.h> 
#include<conio.h> 

void merge(int *ptr1, int *ptr2, int m, int n) 
{ 
    int *p=new int[m+n],i,j,k; 
    for(i=0,k=m-1;i<(m/2);i++,k--) //to reverse the fir``st array from ascending to descending 
    { 
     j=*(ptr1+i); 
     *(ptr1+i)=*(ptr1+k); 
     *(ptr1+k)=j; 
    } 
    for(i=0,j=0,k=0;i<m&&j<n;) 
    { 
     if (*(ptr1+i) > *(ptr2+j)) 
     { 
     *(p+k)=*(ptr1+i); 
     i++;k++; 
     } 
     else 
     { 
      *(p+k)=*(ptr2+j); 
     j++;k++; 
     } 
    } 
    if(i==m) 
     while(j<n) 
     { 
      *(p+k)=*(ptr2+j); 
      j++;k++; 
     } 
    else if(j==n) 
     while(i<m) 
     { 
     *(p+k)=*(ptr1+i); 
     i++;k++; 
     } 
    cout<<"\n\n"; 
    for(i=0;i<k;i++) 
     cout<<*(p+i)<<" "; 
    getch(); 
    delete p; 
} 

void main() 
{ 
    clrscr(); 
    int i,j,k,a,b; 
    cout<<"\nEnter the size of the first array first array : "; 
    cin>>a; 
    cout<<"\nEnter the size of second array : "; 
    cin>>b; 
    int *p1=new int[a], *p2=new int[b]; 
    cout<<"\nEnter the elements of the first array : "; 
    for(i=0;i<a;i++) 
     cin>>*(p1+i); 
    cout<<"\nEnter the elements of the second array : "; 
    for(i=0;i<b;i++) 
     cin>>*(p2+i); 
    for(i=1;i<a;i++) //insertion sort to sort 1st array in ascending order 
    { 
     k=*(p1+i); 
     for(j=i-1;j>=0&&*(p1+j)>k;j--) 
    *(p1+j+1)=*(p1+j); 
     *(p1+j+1)=*(p1+j); 
    } 
    for(i=1;i<b;i++) //insertion sort to sort the 2nd array in descending order 
    { 
     k=*(p2+i); 
     for(j=i-1;j>=0&&*(p2+j)>k;j--) 
    *(p2+j+1)=*(p2+j); 
     *(p2+j+1)=*(p2+j); 
    } 
    for(i=0;i<k;i++) 
     cout<<*(p1+i)<<" "; 
    cout<<endl; 
    /* int c[]={3,5,7}; 
    int d[]={8,6,4}; 
    merge(c,d,3,3); */ To check 
    merge(p1,p2,a,b); 
    delete p1; 
    delete p2; 
} 

Функция слияния работает идеально, но я не понимаю, почему сортировка вставки не работает пропозиционально. Может ли кто-нибудь помочь?Слияние 2 массивов указателями

Я проверил слияние отдельно, используя отсортированный статический массив, как показано в конце кода, слияние сработало нормально, но когда я использовал динамическое распределение, код не работал.

+3

Почему вы не используете алгоритмы STL? Это будет 5 лайнер. – inf

+1

'void main()' is ** недействителен C++ **. (И у меня есть сомнения относительно '', тоже.) –

+0

Я верю '' это Win32ism. – duskwuff

ответ

1
for(j=i-1;j>=0&&*(p1+j)>k;j--) 
    *(p1+j+1)=*(p1+j); 
*(p1+j+1)=*(p1+j); 

В последней строке следует читать

*(p1+j+1)=k 

иначе вы получите некоторые фиктивные данные, так как j == -1 после цикла. И то же самое для второго сорта.

Кроме того, ваша распечатка массива в конце неправильная, он должен использовать a, а не k как верхний предел.

Ваша функция слияния меняет один массив, но не другой. Либо вам придется сортировать второй массив в порядке убывания (как говорит комментарий), либо еще лучше удалить реверсирование в начале функции слияния и отсортировать массивы в правильном порядке для начала.

И, наконец, ваш код становится намного легче читать (и, следовательно, отлаживать), если вы используете дескриптивные имена переменных и правильно отформатируете код.

+0

да, теперь я вижу, я должен был это заметить. Глупая ошибка! спасибо :) – Richie

2

Вы также должны заменить delete с помощью delete [].

+0

hmmmm thanks :) – Richie

Смежные вопросы