Some Points:
- The declaration and definition of template class must be in the same file, or build error. e.g. see detail
Error LNK2019 unresolved external symbol "public: __cdecl QuickSort<int>::QuickSort<int>(int *,bool)" (??0?$QuickSort@H@@QEAA@PEAH_N@Z) referenced in function main HelloWorld D:\SourceCode\VisualStudio\HelloWorld\HelloWorld\HelloWorld.obj 1
- Review the quick sort algorithm. Time Complexity: average: O(nlogn), worst: O(n^2).
- We can get the length of the array by using the function "(int) _msize(pointer)", pointer point to the array. Only the array which created dynamically could use this function.
Source Code:
-
main.cpp
#include "pch.h"
#include "pch.cpp"
int main()
{
int *int_a = new int[10];
int *int_b = new int[10];
for (int i = 0; i < 10; i++) {
std::cin >> int_a[i];
int_b[i] = int_a[i];
}
// only the array which created dynamically could use the function '_msize()'.
QuickSort<int> tmp(int_a), tep(int_b, true);
tmp.sort();
tep.sort();
tmp.show();
tep.show();
double *double_a = new double[10];
double *double_b = new double[10];
for (int i = 0; i < 10; i++) {
std::cin >> double_a[i];
double_b[i] = double_a[i];
}
// only the array which created dynamically could use the function '_msize()'.
QuickSort<double> tmp_2(chr_a), tep_2(chr_b, true);
tmp_2.sort();
tep_2.sort();
tmp_2.show();
tep_2.show();
return 0;
}
-
pch.h
#ifndef PCH_H
#define PCH_H
#include <iostream>
template <class T>
class QuickSort {
public:
QuickSort(T *arr, bool reverse = false);
~QuickSort();
void sort();
void show();
protected:
void onSort(int p, int q);
int getPartition(int p, int q);
private:
int num;
T *arr;
bool reverse;
};
-
pch.cpp
#include "pch.h"
template <class T>
QuickSort<T>::QuickSort (T *arr, bool reverse) {
this->arr = arr;
this->num = (int)_msize(arr) / sizeof(T);
this->reverse = reverse;
}
template <class T>
QuickSort<T>::~QuickSort() {
if (arr != nullptr)
free(arr);
}
template<class T>
void QuickSort<T>::sort() {
onSort(0, num - 1);
}
template <class T>
void QuickSort<T>::onSort(int p, int q) {
if (p < q) {
int mid = getPartition(p, q);
onSort(p, mid - 1);
onSort(mid + 1, q);
}
}
template <class T>
int QuickSort<T>::getPartition(int p, int q) {
T stand = arr[p];
int i = p, j = q + 1;
while (true) {
while (arr[++i] <= stand && i < q);
while (arr[--j] >= stand && j > p);
if (i >= j) break;
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
arr[p] = arr[j];
arr[j] = stand;
return j;
}
template <class T>
void QuickSort<T>::show() {
if (this->reverse) {
for (int i = num - 1; i >= 0; i--)
std::cout << arr[i] << ' ';
std::cout << std::endl;
return;
}
for (int i = 0; i < num; i++)
std::cout << arr[i] << ' ';
std::cout << std::endl;
}