归并排序(分治思想)

来源:互联网 发布:golang prometheus 编辑:程序博客网 时间:2024/05/17 13:41

分治:

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

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

合并问题:把两个有序表合并成一个

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;void merge_sort(int *A,int x,int y,int *T){    if(y-x>1)    {        int m=x+(y-x)/2;            //划分成左右两半数组        int p=x,q=m,i=x;            //p记录左半数组的最左边位置,q记录分界位置同时也是左半数组不可到达的右边界,右半数组的最左边位置        merge_sort(A,x,m,T);        //i也是记录最左边界        merge_sort(A,m,y,T);        while(p<m||q<y)             //左半数组没有遍历一遍或右半数组没有遍历一遍进入循环        {            if(q>=y||(p<m&&A[p]<=A[q]))     //右半数组已经遍历完或左半数组没有遍历完同时当前所指定的左半数组元素小于等于右半数组元素                T[i++]=A[p++];            else                T[i++]=A[q++];        }        for(i=x;i<y;i++)                    //将已经排完序的元素转回到A数组中        A[i]=T[i];    }}int main(){    int a[100],b[100];    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        merge_sort(a,0,n,b);        for(int i=0;i<n;i++)            printf("%d ",a[i]);    }    return 0;}


0 0
原创粉丝点击