void merge_sort(VInt& arr, int p, VInt& sarr) { int len = arr.size(); int leftLen = p ; int rightLen = len - p; VInt leftSorted; VInt rightSorted; //cout<<"ll "<<leftLen<<"rl "<<rightLen<<endl; if(leftLen > 1) { VInt larr(arr.begin(), arr.begin() + p); merge_sort(larr,leftLen/2, leftSorted); } else{ //cout<<"only one left"<<endl; leftSorted.push_back(arr[0]); } if(rightLen > 1) { VInt rarr(arr.begin() + p, arr.end()); merge_sort(rarr,rightLen/2, rightSorted); } else { //cout<<"only one right"<<endl; rightSorted.push_back(arr[1]); } combine(leftSorted, rightSorted, sarr); }
TEST(Util, RandomOrderTest) { VInt tmp; RandomOrder(100, 1000, &tmp); SInt dic; ToSet(tmp, &dic); EXPECT_EQ(100, dic.size()); int c = 0; for (size_t i = 0; i < tmp.size(); i++) { if (tmp[i] == i) { c++; } } EXPECT_LT(c, 3); }
bool HigherOrder::removeEle(const VInt& face, int ele) { SInt fs(face.begin(), face.end()); SInt& eles = midele[fs]; eles.erase(ele); if (eles.empty()) { // remove the face midele.erase(fs); ho.erase(fs); } return eles.empty(); }
int main() { dumpVector(gInputArray); VInt sorted; merge_sort(gInputArray, gInputArray.size()/2, sorted); dumpVector(sorted); }
void Grath::job() { int n, m, i; cout << "Введите количество вершин и количество рёбер:"<<endl; // Прочитаем граф scanf("%d%d", &n, &m); graph.resize(n); cout<< "Вводите рёбра:"<<endl; while(m--) { int from, to; scanf("%d%d", &from, &to); graph[from - 1].push_back(to - 1); graph[to - 1].push_back(from - 1); } // Запустим первый поиск (вычислим enter и low) vrem.assign(n, 0); parents.assign(n, -1); enter.resize(n); low.resize(n); double t1 = omp_get_wtime(); // системное время до выполнения функции for(i = 0; i < n; i++) if(vrem[i] == 0) { Cout_iter++; visitLow(i); } // Запустим второй поиск (определение идентификаторов bcc) // Второй поиск запускается "по следам" первого, // то есть проходит по уже найденному дереву bcc.assign(n, -1); for(i = 0; i < n; i++) if(parents[i] == -1) { Cout_iter++; visitBCC(i); } // Выведем результат VVPInt comps(newIndex); for(i = 0; i < n; i++) for(VIter it = graph[i].begin(); it != graph[i].end(); it++) if(i < *it) { Cout_iter++; int id = getBCC(i, *it); if (id != -1) comps[id].push_back(PInt(i, *it)); } double t2 = omp_get_wtime(); // время после выполнения функции bool z=false; for(i = 0; i < newIndex; i++) { printf("Компонент %d: ", i+1); for(VPIter edge = comps[i].begin(); edge != comps[i].end(); edge++) { printf("(%d, %d) ", edge->first + 1, edge->second + 1); z=true; } printf("\n"); } if (z==false) cout<<"Нет компонентов!"<<endl; double time = t2 - t1; cout<<"Время выполнения: "<<time<<endl; cout<<"Количество базовых операций: "<<Cout_iter<<endl; }
int SumTopN(const VInt &src, int len) { return std::accumulate(src.begin(), src.begin() + len, 0); }
Str Join(const VInt &data, const Str &del) { return Join(data.begin(), data.end(), del); }
void HigherOrder::addEle(const VInt& face, int ele) { SInt fs(face.begin(), face.end()); midele[fs].insert(ele); }
void combine(VInt& l, VInt& r, VInt& output) { int i = 0; int j = 0; while( i < l.size() && j < r.size()) { if(l[i] < r[j]) { output.push_back(l[i++]); } else { output.push_back(r[j++]); } } VIter o_end = output.end(); if( i < l.size()) { output.insert(o_end, l.begin()+ i, l.end()); } else { output.insert(o_end, r.begin() + j, r.end()); } }