DSA学习笔记——向量5(排序器)

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;
}
发布了38 篇原创文章 · 获赞 0 · 访问量 2010

猜你喜欢

转载自blog.csdn.net/Nemoosi/article/details/104766711
dsa