Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <functional>
- template <typename T> int sortUp(T a, T b)
- {
- return a < b;
- }
- template <typename T> int sortDown(T a, T b)
- {
- return a > b;
- }
- template <typename T> void arrPrint(T* arr, int arrSize)
- {
- for (int i = 0; i < arrSize; i++) { std::cout << arr[i] << " "; }; std::cout << '\n';
- }
- template <typename T> void sortArr(T* arr, int arrSize, std::function<int(T, T)> sortCrit, std::function<void(T*, int)> print=nullptr)
- {
- if (print) print(arr, arrSize);
- for (int head = 0; head < arrSize; head++)
- {
- for (int tail = arrSize - 1; tail > head; tail--)
- {
- if (sortCrit(arr[tail],arr[head]))
- {
- T tmp = arr[tail];
- arr[tail] = arr[head];
- arr[head] = tmp;
- if (print) print(arr, arrSize);
- }
- }
- }
- if (print) print(arr, arrSize);
- }
- template <typename T> T* uniqArr(T* arr, int arrSize, int& uniqSize, std::function<void(T*, int)> print=nullptr)
- {
- sortArr<T>(arr, arrSize, sortUp<T>);
- uniqSize = 1;
- for (int head = 1; head < arrSize; head++)
- {
- uniqSize+=(arr[head] != arr[head-1]);
- }
- T* uniqArr = new T[uniqSize];
- uniqArr[0] = arr[0];
- for (int orig = 1, uniq = 1; orig < arrSize; orig++)
- {
- if (arr[orig] != arr[orig-1])
- {
- uniqArr[uniq++] = arr[orig];
- }
- }
- if (print) print(uniqArr, uniqSize);
- return uniqArr;
- }
- template <typename T> int binSearch(T* arr, int arrSize, T key)
- {
- int left = 0, right = arrSize - 1, mid=0;
- while(1)
- {
- mid = (left + right) / 2;
- if (key == arr[mid]) { return mid;};
- if (key < arr[mid]) { right = mid - 1;}
- if (key > arr[mid]) { left = mid + 1;}
- if (left > right) { return -1; };
- }
- }
- template <typename T> T* intersectArr(T* arrA, int arrASize, T* arrB, int arrBSize, int& resSize, std::function<void(T*, int)> print=nullptr)
- {
- int uniqSizeA = 0;
- int uniqSizeB = 0;
- auto uniqArrA = uniqArr<T>(arrA,arrASize, uniqSizeA, print);
- auto uniqArrB = uniqArr<T>(arrB,arrBSize, uniqSizeB, print);
- T* resArr = new T[uniqSizeA + uniqSizeB];
- resSize = 0;
- for (int i=0; i<uniqSizeA; i++)
- {
- if (binSearch(uniqArrB, uniqSizeB, uniqArrA[i]) == -1)
- {
- resArr[resSize++] = uniqArrA[i];
- }
- }
- for (int i=0; i<uniqSizeB; i++)
- {
- if (binSearch(uniqArrA, uniqSizeA, uniqArrB[i]) == -1)
- {
- resArr[resSize++] = uniqArrB[i];
- }
- }
- T* tmpArr = new T[resSize];
- for (int i=0; i<resSize; i++)
- {
- tmpArr[i]=resArr[i];
- }
- delete[] resArr;
- resArr = tmpArr;
- sortArr<T>(resArr, resSize, sortUp<T>);
- if (print) print(resArr, resSize);
- delete[] uniqArrA;
- delete[] uniqArrB;
- return resArr;
- }
- int main()
- {
- int resSize = 0;
- int arrA[] = { 6,1,4,2,8,9,11,26,2,7,8,11,2,2,3 };
- int arrB[] = { 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
- auto resArr = intersectArr<int>(arrA, sizeof(arrA)/sizeof(int), arrB,sizeof(arrB)/sizeof(int), resSize);
- arrPrint<int>(resArr, resSize);
- delete[] resArr;
- }
Add Comment
Please, Sign In to add comment