[shkola] mergesort, interpolacionno i dvoichno tyrsene
- From: Boian Bonev <jdfu@xxxxxxx>
- To: shkola <shkola@xxxxxxxxxxxxx>
- Date: Sun, 16 Nov 2003 01:28:14 +0200
eto vi sorsovete na tiq raboti deto govorihme
--
{JDFU}<a
href='http://mail.bg/ads/adclick.php?bannerid=875&zoneid=13&source=&ismap='
target='_blank'><p> Семестър по сексознание за напреднали!<br/>
Спечели 3000 лева в новия конкурс на http://Femalelife.bg</p></a><div
id="beacon_875" style="position: absolute; left: 0px; top: 0px; visibility:
hidden;"><img
src='http://mail.bg/ads/adlog.php?bannerid=875&clientid=289&zoneid=13&source=&block=0&capping=0&cb=aeac175ba50a247ba7bfb8b20bb27786'
width='0' height='0' alt='' style='width: 0px; height: 0px;'></div>
#include <iostream.h>
#define MAX 1024
#define NO (-1)
int n; // broi elementi v masiva
int a[MAX]; // masiv za sortirane
int b[MAX]; // pomoshten masiv
void mergesort(int l, int r) // lqva i dqsna granica
{ int m;
if (l >= r) return;
m = (l+r)/2;
// razdrobqvane na po-malki chasti i sortiraneto im
mergesort(l, m);
mergesort(m+1,r);
//slivane na veche sortirani po-malki chasti ot masiva
//
//dvete chasti se zapisvat v b[] v razlichni posoki
//s cel izbqgvane na proverka dali sa svyrshili elementite
//v ednata ot chastite na masiva
int i,j;
for (i = m; i >= l ; i--)
b[i] = a[i];
for (j = m + 1; j <= r; j++)
b[r+m-j+1] = a[j];
i++;j--;
for (int k = l; k <= r; k++)
if (b[i] < b[j])
a[k] = b[i++];
else
a[k] = b[j--];
//
}
int bsearch(int x) // binary search
{ int l = 0, r = n-1;
int m;
while (l <= r)
{ // izchislqvame sredata
m = (l + r)/2;
// proverqvame dali sredniq element ne e tyrseniq
// ako ne e otrqzvame edna ot chastite
if (a[m] == x)
return m;
else if (x < a[m])
r = m - 1;
else
l = m + 1;
}
//ako v cikyla ne namerim nistho, znachi takyv element lipsva
return NO;
}
int isearch(int x) // interpolacionno tyrsene
{ int l = 0,r = n - 1,m;
double t;
while (l <= r)
{ // pravim proverka za da izbegnem delenie na nula
if (a[l] == a[r])
// i ne zabravqme dali veche ne sme otkrili x
if (a[l] == x)
return l;
else
return NO;
//izchislqvame koeficienta t
t = (double)(x - a[l])/(a[r] - a[l]);
// proverqvame dali ne izlizame ot granicite na masiva
if (t > 1 || t < 0)
return NO;
// izchislqvame priblizitelnata poziciq na x
m = (int)(l + t*(r-l) + 0.5);
// rejem nenujnata chast ot masiva
if (x == a[m])
return m;
else if (x < a[m])
r = m - 1;
else
l = m + 1;
}
return NO;
}
int main()
{ int i,x;
cin >> n;
for (i = 0; i < n; i++)
cin >> a[i];
mergesort(0 , n-1);
for (i = 0; i < n; i++)
cout << a[i] << "\n";
cin >> x;
cout << bsearch(x) << "\n" << isearch(x) << "\n";
return 0;
}
Other related posts:
- » [shkola] mergesort, interpolacionno i dvoichno tyrsene