分治法 归并排序(递归算法)

来源:互联网 发布:消防调试联动编程 编辑:程序博客网 时间:2024/05/23 22:32

当待排序的序列长度为1,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都以排好序。

分解—>解决—>合并

#include<cstdio>using namespace std;int MERGE(int *A, int p, int q, int r){    int n1 = q - p + 1;    int n2 = r - q;    int L[1000],R[1000];    //初始化数组L[]R[]为无穷大(分别定义两个数组最后的值为哨兵即无穷大);    for(int i = 0; i <= n1+1; i++)        L[i] = 1 << 30;    for(int i = 0; i <= n2+1; i++)        R[i] = 1 << 30;    //分别向数组L[]R[]赋值;    for(int i = 1; i <= n1;i++)        L[i] = A[p + i - 1];    for(int j = 1; j <= n2;j++)        R[j] = A[q+j];    //重新定义i,j(之前在以上四个for循环中定义的i,j寿命只限于其所在的for循环中);    int i = 1;    int j = 1;    //进行归并;    for(int k = p; k <= r; k++){        if(L[i] <= R[j]){            A[k] = L[i];            i++;        }        else        {            A[k] = R[j];            j++;        }    }}int MERGE_SORT(int *A,int p,int r){    if(p < r)    {        int q = ((p+r)/2);        //进行递归;        MERGE_SORT(A,p,q);        MERGE_SORT(A,q+1,r);        MERGE(A,p,q,r);    }}int main(){    int A[10000];    int p,r,n;    scanf("%d",&n);    p = 1;    r = n;    printf("输入原数组:\n");    for(int i = 1;i <= n;i++)        scanf("%d",&A[i]);    MERGE_SORT(A,p,r);    printf("归并后的结果为:\n");    for(int j = 1;j <= n;j++)        printf("%d ",A[j]);    return 0;}

这里写图片描述
实验室的锁让我搞坏了,先写这些,要去解决锁的问题了。

0 0