C++排序类模板, 排序类

来源:互联网 发布:阿里云服务器下载速度 编辑:程序博客网 时间:2024/05/17 22:13

我的C++一直比较水,平时都用C写程序,今天想写一个排序类模板,练习一下。

希尔排序,快速排序,归并排序,选择排序,冒泡排序,堆排序,插入排序

再添加一个二分法查找吧。

这些代码只经过了简单的测试。


#include <stdio.h>#include <stdlib.h>#include <string.h>template <class Type>class sort {public:sort(int (*cmp)(Type t1, Type t2));~sort() {}void adjust_heap(Type *root, int i, int size);void create_heap(Type *root, int size);void heap_sort(Type *root, int size);void select_sort(Type *root, int size);void shell_sort(Type *root, int size);void quick_sort(Type *root, int l ,int r);int partition(Type *root, int l, int r);void merge_sort(Type *root, int l, int r);void merge(Type *root, int l, int mid, int r);void bubble_sort(Type *root, int size);void insert_sort(Type *root, int size);Type *binary_search(Type *root, int size, Type *s);private:int (*compare)(Type t1, Type t2);};template <class Type> Type * sort<Type>::binary_search(Type *root, int size, Type *s) {int left = 0;int right = size - 1;int result;while (left <= right) {int mid = left + (right - left) / 2;result =  cmp(root[mid], *s);if (result == 0) {return root + mid;}else if (result > 0) {right = mid - 1;}else {left = mid + 1;}}return NULL;}template <class Type>void sort<Type>::insert_sort(Type *root, int size) {int i, j, k;for (i = 1; i < size; i++) {Type mark = root[i];k = i;for (j = i ; j > 0; j--) {if (cmp(root[j - 1], mark) > 0) {root[j] = root[j - 1];}else {break;}}if (j != i) {root[j] = mark;}}}template <class Type>sort<Type>::sort(int (*cmp)(Type t1, Type t2)) {this->compare = cmp;}template <class Type>void sort<Type>::adjust_heap(Type *root, int i, int size){int left, right, mark;left = 2 * i + 1;right = left + 1;if (left >= size) {return;}mark = i;if (cmp(root[mark] , root[left]) < 0) {mark = left;}if (right < size && cmp(root[mark], root[right]) < 0) {mark = right;}if (mark != i) {Type tmp = root[i];root[i] = root[mark];root[mark] = tmp;adjust_heap(root, mark, size);}}template <class Type>void sort<Type>::create_heap(Type *root, int size){int range = size / 2 - 1;while (range >= 0) {adjust_heap(root, range--, size);}}template <class Type>void sort<Type>::heap_sort(Type *root, int size){create_heap(root, size);while ( size > 1) {size--;Type tmp = root[0];root[0] = root[size];root[size] = tmp;adjust_heap(root, 0, size);}}template <class Type>void sort<Type>::select_sort(Type *root, int size){int i, j, k;for (i = 0; i < size; i++) {k = i;for (j = i + 1; j < size; j++) {if ( cmp(root[k], root[j]) > 0) {k = j;}}if (k != i) {Type tmp = root[k];root[k] = root[i];root[i] = tmp;}}}template <class Type>void sort<Type>::shell_sort(Type *root, int size){int i, j, grp;Type temp;for (grp = size / 2; grp > 0; grp /= 2) {for (i = grp; i < size; i++) {for (j = i - grp; j >= 0; j -= grp) {if (cmp(root[j], root[j + grp]) > 0) {temp = root[j];root[j] = root[j + grp];root[j + grp] = temp;}}}}}template <class Type>void sort<Type>::quick_sort(Type *root, int l, int r){if (l >= r) {return;}int div = partition(root, l, r);quick_sort(root, l, div - 1);quick_sort(root, div + 1, r);}template <class Type>void sort<Type>::merge_sort(Type *root, int l, int r){int mid;if (l >= r) {return;}mid = l + (r - l) / 2;merge_sort(root, l, mid);merge_sort(root, mid + 1, r);merge(root, l, mid, r);}template <class Type>void sort<Type>::merge(Type *root, int l, int mid, int r){int i, j, k;int size1 = mid - l + 1;int size2 = r - mid;Type *dup1 = (Type *)malloc(size1 *sizeof(Type));Type *dup2 = (Type *)malloc(size2 *sizeof(Type));memcpy(dup1, root + l, size1 *sizeof(Type));memcpy(dup2, root + mid + 1, size2 * sizeof(Type));i = j = 0;k = l;while (i < size1 && j < size2) {if (cmp(dup1[i], dup2[j]) < 0) {root[k++] = dup1[i++];}else {root[k++] = dup2[j++];}}while (i < size1) {root[k++] = dup1[i++];}while (j < size2) {root[k++] = dup2[j++];}free(dup1);free(dup2);}template <class Type>int sort<Type>::partition(Type *root, int l, int r){Type mark = root[l];while (l < r) {while (l < r && cmp(mark, root[r]) < 0) {r--;}root[l++] = root[r];while (l < r && cmp(mark, root[l]) > 0) {l++;}root[r] = root[l];}root[l] = mark;return l;}template <class Type>void sort<Type>::bubble_sort(Type *root, int size){int i, j;for (i = 0; i < size; i++) {for (j = 1; j < size - i; j++) {if (cmp(root[j - 1], root[j]) > 0) {Type tmp = root[j - 1];root[j - 1] = root[j];root[j] = tmp;}}}}int cmp(int a, int b){return a - b;}void show(int *arr, int size){int i;for (i = 0; i < size; i++) {printf("%-4d", arr[i]);}printf("\n");}int main(){int unsorted[] = {2, 3, 4, 2, 1, 7, 0, 10, 2,4};sort<int> s(cmp);int f = 2;//s.bubble_sort(unsorted, 10);//s.merge_sort(unsorted, 0, 9);//s.quick_sort(unsorted, 0, 9);//s.shell_sort(unsorted, 10);//s.insert_sort(unsorted, 10);//s.select_sort(unsorted, 10);s.heap_sort(unsorted, 10);printf("%d \n", *(s.binary_search(unsorted, 10, &f)));show(unsorted, 10);}




0 0