算法竞赛入门经典 快速排序和并归排序
来源:互联网 发布:炉石淘宝买卡包安全吗 编辑:程序博客网 时间:2024/05/29 16:21
/*快速排序 和 归并排序求逆序对*/#include<cstring>#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>#include <algorithm>using namespace std;const int MAX = 500;int A[MAX];int n;int tot;int T[MAX];int merge_sort(int p, int q){ int cnt = 0; if(q-p > 1) { int m = p + (q-p)/2; cnt += merge_sort(p, m); cnt += merge_sort(m, q); int x = p, y = m, i = p; while(x<m || y<q) { tot++; if(y>=q || (x<m && A[x]<=A[y])) { T[i++] = A[x++]; } else { cnt += (m-x); T[i++] = A[y++]; } } for(int i=p; i<q; i++) { tot++; A[i] = T[i]; } } return cnt;}int patition(int p, int q){ int key = A[q-1]; int j=p-1; for(int i=p; i<q-1; i++) { tot++; if(A[i] < key) { swap(A[i], A[++j]); } } swap(A[++j], A[q-1]); return j;}void quick_sort(int p, int q){ if(q-p > 1) { int m = patition(p, q); quick_sort(p, m); quick_sort(m+1, q); }}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("merge_sort.txt", "w", stdin); #endif while(scanf("%d", &n) == 1) { for(int i=0; i<n; i++) { scanf("%d", &A[i]); } printf("%d: ", n); for(int i=0; i<n; i++) { printf("%d ", A[i]); } printf("\n"); tot = 0; //quick_sort(0, n); //printf("time:%d\n", tot); int ret = merge_sort(0, n); printf("re_order: %d\n", ret); printf("time:%d\n", tot); for(int i=0; i<n; i++) { printf("%d ", A[i]); } } return 0;}