快速寻找满足条件的两个数(两数之和为给定值)

首先递增排序,首尾指针相加,大于目标数,尾指针前移,小于目标数,首指针后移,继续比较,直到两指针相遇。

程序如下,借用这个问题,练习一下MergeSort

#include <stdio.h>
#include <boost/scoped_ptr.hpp>
void FindTargetSum(int array[], int begin, int end, int target_value) {
  int min = begin;
  int max = end;
  int sum;
  while (min < max) {
    sum = array[min] + array[max];
    if (sum > target_value) {
      max--;
    } else if (sum < target_value) {
      min++;
    } else {
      printf("%d %d\n", array[min], array[max]);
      FindTargetSum(array, min - 1, max - 1, target_value);
      break;
    }
  }
}
template<typename T>
void Merge(T array[], int begin, int middle, int end) {
  int length1 = middle - begin + 1;
  int length2 = end - middle;
  boost::scoped_ptr<T> first_array_buffer(new T[length1]);
  T* first = first_array_buffer.get();
  boost::scoped_ptr<T> second_array_buffer(new T[length2]);
  T* second = second_array_buffer.get();
  for (int i = 0; i < length1; ++i) {
    first[i] = array[begin + i];
  }
  for (int i = 0; i < length2; ++i) {
    second[i] = array[middle + 1 + i];
  }
  int pos1 = 0;
  int pos2 = 0;
  int pos = begin;
  while (pos1 < length1 || pos2 < length2) {
    if (pos1 < length1 && pos2 < length2) {
      if (first[pos1] < second[pos2]) {
        array[pos++] = first[pos1++];
      } else {
        array[pos++] = second[pos2++];      
      }
    } else if (pos1 < length1) {
      array[pos++] = first[pos1++];
    } else {
      array[pos++] = second[pos2++];
    }
  }
}
  
template<typename T>
void MergeSort(T array[], int begin, int end) {
  if (begin < end) {
    int middle = (begin + end ) / 2;
    //    int middle1 = begin + (end - begin + 1) / 2;
    //    printf("--middle:%d, middle1:%d\n", middle, middle1);
    MergeSort(array, begin, middle);
    MergeSort(array, middle + 1, end);
    Merge(array, begin, middle, end);
  }
}
template<typename T>
void Merge1(T array[], int begin, int middle, int end) {
  int length1 = middle - 1 - begin + 1;
  int length2 = end - middle + 1;
  boost::scoped_ptr<T> first_buffer(new T[length1]);
  T* first = first_buffer.get();
  boost::scoped_ptr<T> second_buffer(new T[length2]);
  T* second = second_buffer.get();
  for (int i = 0; i < length1; ++i) {
    first[i] = array[begin + i];
  }
  for (int i = 0; i < length2; ++i) {
    second[i] = array[middle + i];
  }
  int pos = begin;
  int pos1 = 0;
  int pos2 = 0;
  while (pos1 < length1 || pos2 < length2) {
    if (pos1 < length1 && pos2 < length2) {
      if(first[pos1] < second[pos2]) {
        array[pos++] = first[pos1++];
      } else {
        array[pos++] = second[pos2++];
      }
    } else if (pos1 < length1) {
      array[pos++] = first[pos1++];
    } else {
      array[pos++] = second[pos2++];
    }
  }
}
      

template<typename T>
void MergeSort1(T array[], int begin, int end) {
  if (begin < end) {
    int middle = begin + (end - begin + 1) / 2;
    MergeSort1(array, begin, middle - 1);
    MergeSort1(array, middle, end);
    Merge1(array, begin, middle, end);
  }
}
int main(int argc, char** argv) {
  int array[] = {1, 5, 4, 7, 8 ,10};
  size_t array_size = sizeof(array) / sizeof(int);
  MergeSort1(array, 0, array_size - 1);
  for (int i = 0; i < array_size; ++i) {
    printf("%d ", array[i]);
  }
  printf("\n");
  FindTargetSum(array, 0, array_size - 1, 15);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值