数据结构-之-排序算法-模板篇~
原创文章如转载请注明:转自¥忘%风 {http://www.cnblogs.com/slave_wc}
本文地址: 数据结构-之-排序算法-模板篇~
投了个淘宝实习的简历,听说笔试会偏数据结构和算法,于是下午看了下数据结构,复习了一些排序算法。
顺便写了一个包含多种排序的类模板。以前排序基本不写,做acm都是用库里的sort。
好久没写题目了,本来会的算法就不多,也已经淡忘了差不多了。。。
笔试通知的短信都还没收到呢,额,怎么说,笔试的机会你得给个吧。。。
写篇博存下初步模板,待完善补充 . . .
代码如下:
#define MAXN 1100 typedef struct Node{ int key; bool friend operator >= (const Node &a, const Node &b) { return a.key >= b.key; } bool friend operator <= (const Node &a, const Node &b) { return a.key <= b.key; } bool friend operator < (const Node &a, const Node &b) { return a.key < b.key; } bool friend operator > (const Node &a, const Node &b) { return a.key > b.key; } }List; class Array { private: List r[MAXN]; /*--为方便堆排,0号单元不用--*/ List ret[MAXN]; /*--归并排序的辅助空间--*/ int dlta[MAXN]; /*--为希尔排序设定默认增量序列---*/ /*-----------------快速排序----------------*/ int partition(int low, int high) { List pivotkey = r[low]; while (low < high) { while (low < high && r[high] >= pivotkey) --high; r[low] = r[high]; while (low < high && r[low] <= pivotkey) ++low; r[high] = r[low]; } r[low] = pivotkey; return low; } void quick_sort(int low, int high) { int pivotloc; if (low < high) { pivotloc = partition(low, high); quick_sort(low, pivotloc - 1); quick_sort(pivotloc + 1, high); } } /*-----------------堆排序------------------*/ void creat_heap() { for (int i = length >> 1; i > 0; i --) { heap_adjust(i, length); } } void heap_adjust(int s, int m) { List rc = r[s]; for (int j = s << 1; j <= m; j <<= 1) { if (j < m && r[j] <= r[j+1]) j++; if (rc >= r[j]) break; r[s] = r[j]; s = j; } r[s] = rc; } void heap_sort() { for (int i = length; i > 1; i--) { List tmp = r[1]; r[1] = r[i]; r[i] = tmp; heap_adjust(1, i - 1); } } /*---------------2-路归并排序----------------*/ void merge(int i, int m, int n) { //将r[i, m],r[m+1, n]合并为ret[i, n]; int idx = i, j, k; for (j = m + 1, k = i; i <= m && j <= n; k++) { if (r[i] <= r[j]) ret[k] = r[i++]; else ret[k] = r[j++]; } for ( ; i <= m; i++) ret[k++] = r[i]; for ( ; j <= n; j++) ret[k++] = r[j]; for (j = idx; j <= n; j++) { r[j] = ret[j]; } } void m_sort(int s, int t) { if (s == t) { ret[s] = r[s]; } else { int m = (s + t) / 2; m_sort(s, m); m_sort(m + 1, t); merge(s, m, t); } } /*------------------希尔排序------------------*/ int get_dlta() { /*-------------设定的默认增量值---------------*/ int k = length - 1; int len = 0; while (k > 0) { dlta[len++] = k; k >>= 1; } return len; } void shell_insert(int dk) { int i, j; for (i = dk + 1; i <= length; i++) { if (r[i] < r[i - dk]) { r[0] = r[i];//0号未用,做暂存 for (j = i - dk; j > 0 && r[0] < r[j]; j -= dk) { r[j + dk] = r[j]; } r[j + dk] = r[0]; } } } void shell_sort() { //按增量dlta[0, t - 1];做希尔排序,最后一个为1. int len = get_dlta(); for (int k = len - 1; k >= 0; k--) { shell_insert(dlta[k]); } } /*--------------直接插入排序----------------*/ void insert_sort() { int i, j; for (i = 2; i <= length; i++) { if (r[i] < r[i - 1]) { r[0] = r[i]; //0号不用,做哨兵 for (j = i - 1; r[0] < r[j]; j--) { r[j + 1] = r[j]; } r[j + 1] = r[0]; } } } /*----------------冒泡排序----------------*/ void bubble_sort() { for (int i = 1; i < length; i++) { bool change = false; for (int j = length - 1; j >= i; j--) { if (r[j + 1] < r[j]) { r[0] = r[j]; r[j] = r[j + 1]; r[j + 1] = r[0]; change = true; } } if (!change) return ; } } /*----------------选择排序----------------*/ void select_sort() { for (int i = 1; i < length; i++) { int idx = i; for (int j = i + 1; j <= length; j++) { if (r[j] < r[idx]) { idx = j; } } if (idx != i) { r[0] = r[idx]; r[idx] = r[i]; r[i] = r[0]; } } } public: List *list; int length; enum Sort_Type {MERGE_SORT, QUICK_SORT, HEAP_SORT, SHELL_SORT, INSERT_SORT, BUBBLE_SORT, SELECT_SORT}; Array() { length = 0; list = &r[1]; /*为符合一般习惯,加list指针调整,使区间为[0,length)*/ } void clear() { length = 0; } void push_back(List val) { r[++length] = val; } void Sort(Sort_Type kd, int start, int end) { if (kd == MERGE_SORT) { m_sort(start + 1, end); } else if (kd == QUICK_SORT){ quick_sort(start + 1, end); } } void Sort(Sort_Type kd) { if (kd == HEAP_SORT) { creat_heap(); heap_sort(); } else if (kd == SHELL_SORT) { shell_sort(); } else if (kd == INSERT_SORT) { insert_sort(); } else if (kd == BUBBLE_SORT) { //puts("----"); bubble_sort(); }else if (kd == SELECT_SORT) { select_sort(); } } }; /*------简单测试了下,题hdu 1040-------------*/ int main() { int test, n; Array a; List tmp; scanf("%d", &test); while (test--) { a.clear(); scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &tmp.key); a.push_back(tmp); } a.Sort(a.HEAP_SORT); a.Sort(a.BUBBLE_SORT); a.Sort(a.SELECT_SORT); a.Sort(a.INSERT_SORT); a.Sort(a.SHELL_SORT); a.Sort(a.MERGE_SORT, 0, a.length); a.Sort(a.QUICK_SORT, 0, a.length); printf("%d", a.list[0]); for (int i = 1; i < a.length; i++) { printf(" %d", a.list[i]); } puts(""); } return 0; }
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架