您的位置:首页 > 其它

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

2012-02-08 10:32 381 查看
首先递增排序,首尾指针相加,大于目标数,尾指针前移,小于目标数,首指针后移,继续比较,直到两指针相遇。

程序如下,借用这个问题,练习一下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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: