dík to jsem si neuvědomil
ale mám další problém, normálně se mi to setřídí, ale z nějakého důvodu mi to nechce udělat onen průnik. když jsem si dal diagnostický výstup, tak jsem přišel na to, že to bere indexy jenom kolem středu setříděného pole, ale při výstupu hodnot, dává jakés takés hodnoty, které jsou snad dobré. myslel jsem si, že jsem udělal fungující funkci na vyhledání prvku v jednom poli z druhého, je to varianta hledáním půlením intervalu, ale pro hodnoty setříděného pole a nesetříděného pole.
dávám tu onu funkci, třeba někdo na něco přijde
- Kód: Vybrat vše
int hledejPrvek(int serazenePole[], int prvni, int posledni, int neserazenePole[]){
int stred = (prvni + posledni) / 2;
printf("\njsem v hledani\n\n");
while(prvni <= posledni){
printf("\njsem v whilu\n\n");
for(int i=0; i < posledni; i++){
if(neserazenePole[i] > serazenePole[stred]){
prvni = stred + 1;
printf("\njsem v prave vetvy\n\n");
cout << i << " " << prvni << " " << posledni << " " << serazenePole[i] << " " << neserazenePole[i];//diagnostika
} else if (neserazenePole[i] < serazenePole[stred]){
posledni = stred - 1;
printf("\njsem v leve vetvy\n\n");
cout << i << " " << posledni << " " << prvni << " " << serazenePole[i] << " " << neserazenePole[i];//diagnostika
} else {
return stred >> vystupniPole[i];
cout << stred << " ";
}
cout << " konec foru " << stred << endl;
}
return -(prvni + 1);
}
}
a ještě celý projekt, kdybych měl náhodou nějakou chybu tam
- Kód: Vybrat vše
#include <iostream>
#include <fstream>
using namespace std;
const unsigned int N = 1000000;
int prvniPole[N];
int druhePole[N];
int vystupniPole[N];
void setridPole(int pole[], int vlevo, int vpravo) {
int i = vlevo, j = vpravo;
int tmp;
int stred = pole[(vlevo + vpravo) / 2];
while (i <= j) {
while (pole[i] < stred){
i++;
}
while (pole[j] > stred){
j--;
}
if (i <= j) {
tmp = pole[i];
pole[i] = pole[j];
pole[j] = tmp;
i++;
j--;
}
};
if (vlevo < j){
setridPole(pole, vlevo, j);
}
if (i < vpravo){
setridPole(pole, i, vpravo);
}
}
//------------------------------------maximum-----------------|
int max(int *pole, int pocet_prvku){
int max = 0;
for(int i = 0; i < pocet_prvku; i++){
if(pole[i] > max){
max = pole[i];
}
}
return (max);
}
//-----------------------------------minimum-----------------!
int min(int *pole, int pocet_prvku){
int min = N;
for(int i = 0; i < pocet_prvku; i++){
if(pole[i] < min){
min = pole[i];
}
}
return (min);
}
//----------------------------------------------hledani prvku druheho pole v prvnim------!
int hledejPrvek(int serazenePole[], int prvni, int posledni, int neserazenePole[]){
int stred = (prvni + posledni) / 2;
printf("\njsem v hledani\n\n");
while(prvni <= posledni){
printf("\njsem v whilu\n\n");
for(int i=0; i < posledni; i++){
if(neserazenePole[i] > serazenePole[stred]){
prvni = stred + 1;
printf("\njsem v prave vetvy\n\n");
cout << i << " " << prvni << " " << posledni << " " << serazenePole[i] << " " << neserazenePole[i];//diagnostika
} else if (neserazenePole[i] < serazenePole[stred]){
posledni = stred - 1;
printf("\njsem v leve vetvy\n\n");
cout << i << " " << posledni << " " << prvni << " " << serazenePole[i] << " " << neserazenePole[i];//diagnostika
} else {
return stred >> vystupniPole[i];
cout << stred << " ";
}
cout << " konec foru " << stred << endl;
}
return -(prvni + 1);
}
}
//----------------------------------main----------------------!
int main(int argc, char *argv[]){
system("cls");
if(argc != 4){
cerr << "\nChyba zadani parametru!" << endl;
return -1;
}
cout << "\nprvni argument je jmeno programu " << argv[0] << endl;
ifstream prvni;
prvni.open(argv[1]);
ifstream druhy;
druhy.open(argv[2]);
ofstream vystup;
vystup.open(argv[3]);
cout << "druhy argument: jmeno souboru1 = " << argv[1] << endl;
cout << "treti argument: jmeno souboru2 = " << argv[2] << endl;
cout << "ctvrty argument: jmeno vystupniho souboru = " << argv[3] << endl << endl;
//-------------------------------------------------uložení do paměti-------!
cout << "prvni soubor" << endl;
for(int i=0; i < N; i++){
prvni >> prvniPole[i];
}
cout << "--------" << endl << endl;
cout << "druhy soubor" << endl;
for(int j=0; j < N; j++){
druhy >> druhePole[j];
}
cout << "--------" << endl << endl;
//--------------------------------------------------maxima-------------!
int max_prvek_pole1 = max(prvniPole, N);
cout << "Maximum pole 1. = " << max_prvek_pole1 << endl;
int max_prvek_pole2 = max(druhePole, N);
cout << "Maximum pole 2. = " << max_prvek_pole2 << endl;
//--------------------------------------------------minima-------------!
int min_prvek_pole1 = min(prvniPole, N);
cout << "Minimum pole 1. = " << min_prvek_pole1 << endl;
int min_prvek_pole2 = min(druhePole, N);
cout << "Minimum pole 2. = " << min_prvek_pole2 << endl << endl;
//-------------------------------------------------setrideni prvniho pole----!
cout << "tridim" << endl;
setridPole(prvniPole,0,N);
for(int i=0; i<10; i++){
cout << prvniPole[i] << " ";
}
cout << "\nsetrideno" << endl;
//-------------------------------------------------vyhledavani prvku----!
cout << "\nhledam prvky" << endl;
hledejPrvek(prvniPole,0,N,druhePole);
cout << "\ndokonceno hledani" << endl;
//------------------------------------------------zapis a tisk souboru ---!
cout << "\nprunik cisel" << endl;
for(int i=0; i < max(vystupniPole,N); i++){
cout << vystupniPole[i] << " ";
vystup << vystupniPole[i];
}
cout << "\nfinite" << endl;
prvni.close();
druhy.close();
vystup.close();
return 0;
}
štábní kultura kodu je hrozná, ale vyznat se v tom teoreticky dá. zajímalo by mě, proč se nedostanu vůbec do posledního else v té hledací funkci? taky jak zrychlit načítání těch souborů a jakékoliv připomínky ke kodu