问题描述:
在给定结合S中,是否存在之和与给定数x相等的两数,有则输出。
#include<iostream>
using namespace std;
const int maxn = 5000;
int main()
{
void merge_sort(int a[], int beg, int end);
void put(int a[], int n);
int binary_sort(int A[], int y, int beg, int end);
int a[maxn], x, n;
cout << "Enter two numbers: ";
cin >> x >> n;
cout << "Enter some numbers:" << endl;
for(int i = 0; i < n ; ++i)
cin >> a[i];
merge_sort(a, 0, n-1);
int index = 0;
for(int i = 0; i < n; ++i)
{
index = binary_sort(a, x-a[i], 0, n-1);
if(index != -1 && index != i)
cout << "YES!!! "<< a[i] << " + " <<a[index] << " == " << x << endl;
}
if(index == -1)
cout << "NO!!!" << endl;
put(a, n);
return 0;
}
void merge(int a[], int beg, int mid, int end)
{
//合并
int n1 = mid - beg + 1, n2 = end - mid;
int L[n1+1], R[n2+1];
for(int i = 0; i < n1; ++i)
L[i] = a[beg+i];
L[n1] = 50000; //哨兵元素
mid = mid + 1;
for(int i = 0; i < n2; ++i)
R[i] = a[mid+i];
R[n2] = 50000; //哨兵元素
int i=0, j =0, k = beg;
//------------------块一----------------------------------
for(int k = beg; k <= end; ++k)
{
//当同时遇到哨兵意味着所有牌已经合并
if(L[i] <= R[j])
{
a[k] = L[i];
++i;
}
else
{
a[k] = R[j];
++j;
}
}
//------------------块一----------------------------------
}
void merge_sort(int a[], int beg, int end)
{
//将n个元素分成各个汗n/2个元素的子问题
int mid = (beg+end)/2;
if(beg < end)
{
merge_sort(a, beg, mid);
merge_sort(a, mid+1, end);
merge(a, beg, mid, end);
}
}
void put(int a[], int n)
{
for(int i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
}
int binary_sort(int a[], int y, int beg, int end)
{//二分查找
int mid;
while(beg < end)
{
mid = (beg+end)/2;
if(y == a[mid])
return mid;
if(y > a[mid])
beg = mid + 1;
else
end = mid -1;
}
return -1;
}
//时间复杂度T(n) = Θ(nlgn);
/*
8 8
1 2 6 4 7 9 3 5
*/
浙公网安备 33010602011771号