归并排序
#include <iostream> using namespace std; int tem[1005]; int a[1005]; bool com1(int x,int y) { return x >= y; } bool com2(int x ,int y) { return x <=y; } void merges(int from[] , int to[],int b ,int m, int e , bool com(int x,int y)) { int i = b; int j = m+1; int k = b; while (i<=m&&j<=e) { if (com(from[i],from[j])) to[k++] = from[i++]; else to[k++] = from[j++]; } for (int t = i; t<=m;) to[k++] = from[t++]; for (int t = j; t<=e;) to[k++] = from[t++]; for (int t = b; t <= e ;t++) from[t] = to[t]; } void mergesort(int a[], int b, int e,bool com(int x,int y)) { if (b >= e ) return; int mid = (b+e)/2; mergesort(a,b,mid,com); mergesort(a,mid+1,e,com); merges(a,tem,b,mid,e,com); } void print(int a[],int n) { for (int i = 1; i<= n; i++) { cout << a[i] <<" "; } cout << endl; } int main() { int n; cin >> n; for (int i = 1 ; i<= n; i++) cin >> a[i]; mergesort(a,1,n,com1); print(a,n); mergesort(a,1,n,com2); print(a,n); }
#include <iostream> using namespace std; int tem[1005]; int a[1005]; bool com1(int x,int y) { return x >= y; } bool com2(int x ,int y) { return x <=y; } void merges(int from[] , int to[],int b ,int m, int e , bool com(int x,int y)) { int i = b; int j = m+1; int k = b; while (i<=m&&j<=e) { if (com(from[i],from[j])) to[k++] = from[i++]; else to[k++] = from[j++]; } for (int t = i; t<=m;) to[k++] = from[t++]; for (int t = j; t<=e;) to[k++] = from[t++]; } //倍增法归并 void mergesort(int a[], int b, int e,bool com(int x,int y)) { int l = 1; int L = e-b+1; //长度 while (l <= L) { int i; for (i = b; i+2*l-1 <= e; i+=2*l) { merges(a,tem,i,i+l-1,i+2*l-1,com); } merges(a,tem,i,min(i+l-1,e),e,com); l *= 2; // 循环数组 for (i = b; i+2*l-1 <= e; i+=2*l) { merges(tem,a,i,i+l-1,i+2*l-1,com); } merges(tem,a,i,min(i+l-1,e),e,com); l *= 2; } } void print(int a[],int n) { for (int i = 1; i<= n; i++) { cout << a[i] <<" "; } cout << endl; } int main() { int n; cin >> n; for (int i = 1 ; i<= n; i++) cin >> a[i]; mergesort(a,1,n,com1); print(a,n); mergesort(a,1,n,com2); print(a,n); }