1、统一入口
template <typename T>
void Vector<T>::sort(Rank lo, Rank hi){
switch(rand() % 5){
case 1: bubbleSort(lo, hi); break;
case 2: selectionSort(lo, hi); break;
case 3: mergeSort(lo, hi); break;
case 4: heapSort(lo, hi); break;
default: quickSort(lo, hi); break;
}
}
2、起泡排序
template <typename T>
void Vector<T>::bubbleSort(Rank lo, Rank hi){
while(!bubble(lo, hi --));
}
template <typename T>
bool Vector<T>::bubble(Rank lo, Rank hi){
bool sorted = true;
while(++lo < hi)
if(_elem[lo-1] > _elem[lo]){
sorted = false;
swap(_elem[i-1], _elem[i]);
}
return sorted;
}
3、归并排序
template <typename T>
void Vector<T>::mergeSort(Rank lo, Rank hi){
if(hi - lo < 2) return;
int mi = (lo + hi) / 2;
mergeSort(lo, mi); mergeSort(mi, hi);
merge(lo, mi, hi);
}
template <typename T>
void Vector<T>::merge(Rank lo, Rank mi, Rank hi){
T* A = _elem + lo;
int lb = mi - lo; T* B = new T[lb];
for(Rank i = 0; i < lb; B[i] = A[i++]);
int lc = hi - mi; T* C = _elem + mi;
for(Rank i = 0, j = 0, k = 0; (j < lb) || (k < lc);){
if((j < lb) && (!(k < lc) || (B[j] <= C[k]))) A[i++] = B[j++];
if((k < lc) && (!(j < lb) || (B[j] > C[k]))) A[i++] = C[k++];
}
delete[] B;
}