题目描述:
给定一个数组和一个整数,要求在数组中找到两个数,使得它们的和为这个整数.
方法:排序夹逼
首先使用快速排序算法把数组按升序排列,然后使用夹逼的方法找到答案.即使用两个指针分别指向数组的头和尾(begin, end).
1. 若arr[begin] + arr[end] == sum 就输出;
2. 若arr[begin] + arr[end] < sum 代表两数的和偏小需要增大,则begin++;
3. 若arr[begin] + arr[end] > sum 代表两数之和偏大需要减小,则end–;
#include <iostream>
using namespace std;
#define MIN 5
void quickSort(int *arr, int first, int last);
int partition(int *arr, int first, int last);
void insertSort(int *arr, int first, int last);
void sortFirstMidLast(int *arr, int first, int mid, int last);
void twoSum(int *arr, int length, int sum);
int main()
{
int array[] = {
-38, 38, -963, 658, 963, 56. 86, -86, -456, 82, 456, 89, -36, 489, -489, 56, 25, 0. -52, 258, 63, -63, 9, 1
};
quickSort(array, 0, sizeof(array)/sizeof(int) - 1);
twoSum(array, sizeof(array)/sizeof(int), 0);
return 0;
}
void quickSort(int *arr, int first, int last)
{
if(last - first + 1 <= MIN) //当剩余部分长度小于MIN时,直接使用插入排序
{
insertSort(arr, first, last);
}
else
{
int index = partition(arr, first, last);
quickSort(arr, first, index - 1);
quickSort(arr, index + 1, last);
}
}
void insertSort(int *arr, int first, int last)
{
for(int un = first + 1; un <= last; un++)
{
int tmp = arr[un];
int local = un;
while(local > 0 && arr[local - 1] > tmp)
{
arr[local] = arr[local - 1];
local--;
}
arr[local] = tmp;
}
}
int partition(int *arr, int first, int last)
{
int mid = first + (last - first) / 2;
sortFirtstMidLast(arr, first, mid, last);
swap(arr[mid], arr[last - 1]);
int index = last - 1;
int value = arr[index];
int leftIndex = first + 1;
int rightIndex = last - 2;
bool done = true;
while(done)
{
while(arr[leftIndex] < value)
leftIndex += 1;
while(arr[rightIndex] > value)
rightIndex -= 1;
if(leftIndex < rightIndex)
{
swap(arr[leftIndex], arr[rightIndex]);
leftIndex += 1;
rightIndex -= 1;
}
else
{
done = false;
}
}
swap(arr[index], arr[leftIndex]);
index = leftIndex;
return index;
}
void sortFirstMidLast(int *arr, int first, int mid, int last)
{
if(arr[first] > arr[mid])
swap(arr[first], arr[mid]);
if(arr[mid] > arr[last])
swap(arr[mid], arr[last]);
if(arr[first] > arr[mid])
swap(arr[first], arr[mid]);
}
void twoSum(int *arr, int length, int sum)
{
int begin = 0;
int end = length - 1;
while(begin < end)
{
if(arr[begin] + arr[end] == sum)
{
cout << arr[begin] << "\t" << arr[end] << endl;
begin += 1;
end -= 1;
}
else if(arr[begin] + arr[end] < sum)
{
begin += 1;
}
else
{
end -= 1;
}
}
}