最近发现自己类模板的使用好像不记得去了,写了个排序模板练练手感,嗯还不错,一次写对
下面是写的是快排以及归并排序
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
using namespace std;
template <typename T>
void print(const T *p,const T *q, string gap = " "){
int d = p < q ? 1 : -1;
while(p != q){
cout << *p;
p += d;
if(p != q) cout << gap;
}
cout << endl;
}
template<typename T>
class Sorts{
public :
const int MAXN = 1e5;
T *A, *B;
Sorts(){A = new T[MAXN];B = new T[MAXN];}
void DC_Sort(int x, int y);
void QC_Sort(int x, int y);
~Sorts(){delete A,B;}
};
template<typename T>
void Sorts<T>::DC_Sort(int x,int y){//归排
if(x == y) return;
int p = x, mid = (x + y) >> 1, q = mid + 1, cnt = 0;
DC_Sort(x, mid);
DC_Sort(mid + 1, y);
while(p <= mid || q <= y){
if(p <= mid && (q > y || A[p] < A[q])) B[cnt ++] = A[p ++];
else B[cnt ++] = A[q ++];
}
p = x;
for(int i = 0;i < cnt; i ++) A[p ++] = B[i];
}
template<typename T>
void Sorts<T>::QC_Sort(int x, int y){//快排
if(x >= y) return;
int p = x, q = y, v = A[x];
while(p < q){
while(p < q && A[q] >= v) q --;
A[p] = A[q];
while(p < q && A[p] < v) p ++;
A[q] = A[p];
}
A[p] = v;
QC_Sort(x, p - 1);
QC_Sort(p + 1, y);
}
int main(){
Sorts<int> Object;
int T, n;
cin >> T;
while(T --){
cin >> n;
for(int i = 0;i < n;i ++){
cin >> Object.A[i];
}
Object.QC_Sort(0,n - 1);
print(Object.A, Object.A + n);
}
return 0;
}
//单顺序链表模板
template<typename T>
class pList {
private:
typedef struct Node {
T data;
Node * next;
Node() {
next = NULL;
}
} *ListHead, *pNode;
ListHead Head;
pNode tail;
public:
pList();
void add(T e);
bool del(int pos);
void print(string gap = " ");
~pList();
};
template<typename T>
pList<T>::pList() {
Head = new Node;
tail = Head;
}
template<typename T>
pList<T>::~pList() {
pNode BNode = Head, CNode;
while(BNode) {
CNode = BNode -> next;
delete BNode;
BNode = CNode;
}
}
template<typename T>
void pList<T>::add(T e) {
pNode CurNode = new Node;
tail -> next = CurNode;
tail = CurNode;
tail -> data = e;
}
template<typename T>
bool pList<T>::del(int pos) {
pNode M_Node = Head -> next;
int posNum = 0;
while(M_Node) {
M_Node = M_Node -> next;
posNum ++;
if(posNum >= pos) break;
}
if(posNum < pos) return false;
return true;
}
template<typename T>
void pList<T>::print(string gap) {
pNode M_Node = Head -> next;
while(M_Node) {
cout << M_Node -> data;
if(M_Node -> next != NULL) cout<< gap;
M_Node = M_Node -> next;
}
cout << endl;
}