C++:利用模板类进行若干排序算法

xiaoxiao2021-02-28  84

template <class T> class CSort { public: CSort(int nArraySize); virtual ~CSort(); void Bubble(T arr[]); //冒泡排序 void insertion(T arr[]); //插入排序 void Quick(T arr[], int leftlimit, int rightLimit); //快速排序 void Selection(T arr[]); //选择排序 private: int _arrSize; }; template <class T> CSort<T>::CSort(int nArraySize) { if (nArraySize < 0) _arrSize = 0; else _arrSize = nArraySize; } template <class T> CSort<T>::~CSort() { } template <class T> void CSort<T>::Bubble(T arr[]) { T tmp; int last = _arrSize - 1; bool isSorted = true; do { isSorted = true; for (int i = 0; i < last; i++) { if (arr[i] > arr[i + 1]) { tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; isSorted = false; } } last--; } while (!isSorted); } template <class T> void CSort<T>::insertion(T arr[]) { T val; for (int i = 1; i < _arrSize; i++) { val = arr[i]; int n; for (n = i - 1; n >= 0 && val < arr[n]; n--) { arr[n + 1] = arr[n]; } arr[n + 1] = val; } } template <class T> void CSort<T>::Quick(T arr[], int lLimit, int rLimit) { int left = lLimit; int right = rLimit; int pivot = (left + right) / 2; T tmp; T mid = arr[pivot]; do { while ((arr[left] < mid) && (left < rLimit)) { left++; } while ((mid < arr[right]) && (right > lLimit)) { right--; } if (left <= right) { tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } while (left <= right); if (lLimit < right) { CSort<T>::Quick(arr, lLimit, right); } if (left < rLimit) { CSort<T>::Quick(arr, left, rLimit); } } template <class T> void CSort<T>::Selection(T arr[]) { T tmp; int min; for (int i = 0; i < _arrSize - 1; i++) { min = i; for (int n = i + 1; n < _arrSize; n++) { if (arr[n] < arr[min]) { min = n; } } tmp = arr[min]; //交换位置 arr[min] = arr[i]; arr[i] = tmp; } } int main() { CSort<int> _sort(11); int arr[] = { 24, 19, 13, 90, -35, 23, 46, -5, 128, 69, 0 }; _sort.Selection(arr); for (int i = 0; i < sizeof arr / sizeof arr[0]; i++) { cout << arr[i] << "\t"; } cout << endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-34722.html

最新回复(0)