Sunteți pe pagina 1din 3

#include <iostream>

#include <stdlib.h>
#define N 6
//divide et impera (dezbina si stapaneste)
//sortare in ordine crescatoare
using namespace std;
int vInitial[N]={7, -3, -1, 9, -6, 8}, v[N];
void interclasare(int inceput1, int sfarsit1, int inceput2, int sfarsit2);
void mergeSort(int inceput, int sfarsit){
//sortare cu interclasare
if(inceput >= sfarsit) return;
int mijloc = (inceput+sfarsit)/2;
mergeSort(inceput, mijloc);
mergeSort(mijloc+1, sfarsit);
interclasare(inceput, mijloc, mijloc+1, sfarsit);
}
void quickSort(int inceput, int sfarsit){
//sortare rapida
if(inceput >= sfarsit) return;
int i = inceput, j = sfarsit, pivot, temp;
pivot = v[(inceput+sfarsit)/2];
do{
//elementele din stanga pivotului sunt mai mici decat cele din d
reapta sa
while(v[i] < pivot) i++;
while(v[j] > pivot) j--;
if(i <= j){//aici am un element mai mare ca pivotul in stanga, p
e pozitia i
//si un element mai mic decat pivotul in dreapta, pe poz
itia j
//si le interschimb
//sau sunt pe pozitia pivotului, pe care il exclud la ap
elul quicksort urmator
temp = v[i];
v[i] = v[j];
v[j] = temp;
i++;
j--;
}
}while(i<j);
quickSort(inceput,j);
quickSort(i,sfarsit);
}
//cautare binara, in vector sortat anterior, in ordine crescatoare
int cautareBinara(int inceput, int sfarsit, int n){//vectorul e initial sortat,
de ex crescator
int pozitie = -1, mijloc;
mijloc = (inceput + sfarsit)/2;
if(v[mijloc] == n) return mijloc;
if((inceput >= sfarsit)&&(pozitie < 0)) return -1;//nu a gasit elementul
, dar nu are unde sa mai caute
if(v[mijloc] < n) pozitie = cautareBinara(mijloc + 1, sfarsit, n);
if(v[mijloc] > n) pozitie = cautareBinara(inceput, mijloc - 1, n);//sau
else
return pozitie;
}
int main(){
int i;
//vector initial
for(i=0; i< N; i++) cout << vInitial[i] << "\t"; cout << endl;
//mergeSort interschimbari
for(i=0; i< N; i++) v[i] = vInitial[i];
mergeSort(0, 5);
for(i=0; i< N; i++) cout << v[i] << "\t"; cout << endl;

//quickSort, in medie O(n log2(n)), dar cazul cel mai prost are O(n^2)
for(i=0; i< N; i++) v[i] = vInitial[i];
quickSort(0,5);
for(i=0; i< N; i++) cout << v[i] << "\t"; cout << endl;
//cautare binara O(log2(n))
int n = 7, pozitie;
pozitie = cautareBinara(0, 6, n);
if(pozitie > 0) cout << "Pozitia " << pozitie << " , elementul " << v[po
zitie] << endl;
else cout << "Nu exista elementul " << n << endl;
//element care nu exista
n = -7;
pozitie = cautareBinara(0, 6, n);
if(pozitie > 0) cout << "Pozitia " << pozitie << " , elementul " << v[po
zitie] << endl;
else cout << "Nu exista elementul " << n << endl;
system("PAUSE");
return 0;
}
void interclasare(int inceput1, int sfarsit1, int inceput2, int sfarsit2){
int vTemp[N], dim_vTemp, i = inceput1, j = inceput2, k = 0;//i pt primul
vector, j pt al doilea si k pt vectorul combinat
dim_vTemp = sfarsit1 - inceput1 + 1 + sfarsit2 - inceput2 + 1;
while((i <= sfarsit1) && (j <= sfarsit2)){
if(v[i] < v[j]){
vTemp[k] = v[i];
i++;
}
else{
vTemp[k] = v[j];
j++;
}
k++;
}
//punem acum ce a mai ramas dupa epuizarea unui vector
while(i <= sfarsit1){
vTemp[k] = v[i];
i++;
k++;
}
//sau
while(j <= sfarsit2){
vTemp[k] = v[j];
j++;
k++;
}
//acum copiez variabila locala peste vectorul original
for(k = 0; k <= sfarsit1 - inceput1; k++) v[inceput1+k] = vTemp[k];
for(k = sfarsit1-inceput1 +1; k <= (sfarsit1 - inceput1 + 1) + (sfarsit2
- inceput2); k++) v[inceput2+(k-sfarsit1+inceput1-1)] = vTemp[k];
}

S-ar putea să vă placă și