华为面试题:交换两个数组,使得数组的和的差最小

本文介绍了一道华为的面试题目,即通过交换两个数组的部分元素来使得这两个数组的元素之和的差值最小。文章提供了详细的算法实现过程,包括数组的快速排序、合并排序及最终的元素交换策略。
/* 
 * question: 华为面试题:交换两个数组的部分元素,使得这两个数组的和的差最小。 
 * Author: hongbin
 */
/*
 9 11 18 19 
merge sorted ->
19 18 11 9 8 7 4 1 


after selection,data list -> 
19 9 8 4 
18 11 7 1 
 
 */
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <assert.h>


using namespace std;


void swapdata(int& x, int &y){
   int temp;
   temp=x;
   x=y;
   y=temp;
   return;
}


void Display(int data[],int begin,int end){
 if(data==NULL) return;
 for(int index=begin;index<=end;index++){
  cout<<data[index]<<" ";
 }
 cout<<endl;
}
//data1 and data2 are sorted descendedly


bool ExchangeData(int total[],int array1[],int array2[],int len){
assert(total !=NULL &&array1 !=NULL && array2 != NULL && len >0 );
int sum1,sum2,index1,index2;
sum1=sum2=index1=index2=0;

while(index1<len && index2<len) {
   if(sum1>sum2) { 
       sum2+=*total;
       array2[index2++] = *total++;
     }
   else {
     sum1+=*total;
     array1[index1++] = *total++;
    }      
 }


while(index1<len)
   array1[index1++] = *total++; 


while(index2<len)
   array2[index2++] = *total++; 


return true;    
}


//归并排序

int* mergesort(int data1[],int data2[],int length1,int length2) {
  assert(data1 != NULL && data2 != NULL);    
  assert(length1 >=0 && length2 >=0 );  
 
  int index=0,len1=0,len2=0;
  int *data3=new int[length1+length2]; 
  
   
  while( len1<length1 && len2<length2 ){
    data3[index++]= data1[len1]>data2[len2]? data1[len1++]:data2[len2++];
  }


   while(len1<length1)  
    data3[index++]=data1[len1++];
  
  while(len2<length2)  
       data3[index++]=data2[len2++];
   
  cout<<"merge sorted ->"<<endl;
  Display(data3,0,length1+length2-1);
   
   return data3;   
}
/*
 * 
 */
bool myqsort2(int data[],int begin,int end){
   bool result=true; 
    
  if( data==NULL || end < 0 || begin < 0 || begin > end) 
      return false;   
   if(begin==end) 
       return result; 
    
    int compare_point,i,j,pilotkey;
    
    srand((unsigned int)time(NULL));
    compare_point=begin + rand()%(end-begin+1);
    pilotkey=data[compare_point];
    
    swapdata(data[compare_point],data[end]);
    
    i=begin;
    j=end;
    
    while(i<j) {   
        while(data[i] >= pilotkey && i<j)
         i++;     
        if(i<j)
          swapdata(data[i],data[j--]);    
     
         while(data[j] <= pilotkey && i<j)
             j--;        
         if(i<j)         
           swapdata(data[i++],data[j]);     
     }
   
    myqsort2(data,begin,i-1);
    myqsort2(data,i+1,end);


}


//descending sort
bool myqsort(int* data,int begin,int end){
  bool result=true;
   int compare_point,midvalue,pivot,index;
   int tempdata;
   
  if( data==NULL || end < 0 || begin < 0 || begin > end) 
      return false;
   
   if(begin==end) 
       return result;
  
   //generate a random number between begin and end
    srand((unsigned int)time(NULL));
    compare_point=begin + rand()%(end-begin+1);
   
   midvalue=data[compare_point]; //use the middle point 
  
  //exchange pivot value into the last element of array 
  swapdata(data[compare_point],data[end]);
   
  index=begin;
  pivot=begin-1;
  while(index <= end){
    if(data[index] > midvalue){   
       if((++pivot) != index){  
        swapdata(data[pivot],data[index]);    
       }      
      } 
    index++;   
  }
  
 //exchange pivot value into the last element of array   
  swapdata(data[++pivot],data[end]);
   
  myqsort(data,begin,pivot-1);
  myqsort(data,pivot+1,end);
  
  return result;
}


int main(int argc, char** argv) {
 //  int data1[]={142,3,2,-12};
 //  int data2[]={31,4,2,1};
    int data1[]={1,4,7,8};
    int data2[]={9,11,18,19};
    int *data3=NULL;
 
   cout<<endl<<"before selection, data list -> "<<endl;
   Display(data1,0,sizeof(data1)/sizeof(int)-1);
   Display(data2,0,sizeof(data2)/sizeof(int)-1);
   //qsort
   myqsort(data1,0,sizeof(data1)/sizeof(int)-1);
   myqsort(data2,0,sizeof(data2)/sizeof(int)-1);
   
    //data3 save all data merges sorted 
   data3=mergesort(data1,data2,sizeof(data1)/sizeof(int),sizeof(data2)/sizeof(int));
 //  cout<<endl<<"after merge sorting"<<endl;
 //  Display(data3,0,7);
   //dispatch data from data3 to data1 or data2 upon the sum difference of data1 and data2 is the least. 
   ExchangeData(data3,data1,data2,sizeof(data1)/sizeof(int));
   
   cout<<endl<<"after selection,data list -> "<<endl;
   Display(data1,0,sizeof(data1)/sizeof(int)-1);
   Display(data2,0,sizeof(data2)/sizeof(int)-1);
   delete []data3;
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值