归并排序

来源:互联网 发布:mac live photo 编辑:程序博客网 时间:2024/06/08 14:25

划分问题:把序列分成元素个数尽量相等的两半

递归求解:把元素两半分别排序

合并问题:把两个有序表合并成一个。每次只需要把两个序列的最小元素加以比较,删除其中的较小元素并加入合并后的新表,我们需要一个附加空间t来进行新表的储存。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int N = 5000;int a[N << 1],t[N << 1],n;void merge_sort(int x, int y){    if(y - x > 1){        int mid = x + (y -x)/2;        int p = x, q = mid, i = x;        merge_sort(x, mid);        merge_sort(mid, y);        while(p < mid || q < y){///左右有一个非空就继续合并            if(q >= y || (p < mid && a[p] <= a[q]))///从左半数组复制到临时空间(右半数组为空,那么左半数组必不为空)                t[i++] = a[p++];            else                t[i++] = a[q++];        }        for(int i=x; i<y; i++)  a[i] = t[i];    }}int main(){//    freopen("in.txt", "r", stdin);    while(scanf("%d",&n) == 1){        for(int i=1; i<=n; i++) scanf("%d",&a[i]);        merge_sort(1,n+1);        for(int i=1; i<=n; i++) printf("%d ",a[i]);        printf("\n");    }    return 0;}



0 0
原创粉丝点击