Pages

Tuesday, March 1, 2011

讨论:merge两个有序数组

一个简单的情况:
假设a中元素都比b中的大
b会越界

标准的应该是3个循环
: 有更优的方法么? thx!
: k=i+j
: a[i],b[j],c[k]
: int ii=jj=kk=0;
: while(kk<k){
:         if(a[ii]>b[jj]){
:                 c[kk]=b[jj];
:                 jj++;
:         } else {
:                 c[kk]=a[ii];


so:
k=i+j
a[i],b[j],c[k]

int ii=jj=kk=0;
while(kk<k){
  if( ii==i || (jj<j && a[ii]>b[jj]) ){
    c[kk]=b[jj];
    jj++;
  } else {
    c[kk]=a[ii];
    ii++;
  }
  kk++;
}


so:

void merge(int *a, int sza, int *b, int szb, int *c) {
    //User is responsible for allocating array c
    int i = 0;
    int j = 0;
    while( i < sza && j < szb ) {
        if( a[i] <= b[j] ) {
            c[i+j] = a[i];
            ++i;
        } else {
            c[i+j] = b[j];
            ++j;
        }
    }
    while( i < sza ) {
        c[i+j] = a[i];
        ++i;
    }
    while( j < szb ) {
        c[i+j] = b[j];
        ++j;
    }
}

No comments:

Post a Comment