排序算法 五.归并排序

归并排序

a

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的算法。

b

c

实现:(一个数组分为两个子序列)
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4.重复步骤3直到某一指针超出序列尾
5.将另一序列剩下的所有元素直接复制到合并序列尾

d

C语言

#include <stdio.h>
void Merge(int R[],int temp[], int start, int mid, int end){
    int i = start, j=mid+1, k = start;
    while(i!=mid+1 && j!=end+1){
        if(R[i] > R[j]){
            temp[k++] = R[j++];
        }
        else{
            temp[k++] = R[i++];
        }
    }
    while(i != mid+1)
        temp[k++] = R[i++];
    while(j != end+1)
        temp[k++] = R[j++];
    for(i=start; i<=end; i++)
        R[i] = temp[i];
}
 
void MergeSort(int R[], int temp[], int start, int end){
    int mid;
    if(start < end){
        mid = start + (end-start) / 2;     //避免溢出int
        MergeSort(R, temp, start, mid);
        MergeSort(R, temp, mid+1, end);
        Merge(R, temp, start, mid, end);
    }
}
 
void main(int argc, char * argv[]{
    int n[10];
    printf("请输入10个数,以逗号隔开:");
    scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
    int i, b[10];
    MergeSort(n, b, 0, 9);
    for(i=0; i<=9; i++){
        printf("%d ", n[i]);
    }
    printf("\n");
}

运行
在这里插入图片描述
C++
main函数

#include <iostream.h>
#include "Merge.h"
void MergeSort(int A[],int low,int high){
    int mid;
    if(low<high){
        mid=(low+high)/2;
        MergeSort(A,low,mid);
        MergeSort(A,mid+1,high);
        Merge(A,low,mid,high);
    }
}
void main(){
    int A[]={NULL,
    9,4,5,2,1,7,4,6
    };
    const int N=sizeof(A)/sizeof(int)-1;
    for(int i=1;i<=N;i++)
        cout<<A[i]<<' ';
    cout<<endl;
    MergeSort(A,1,N);
    for(i=1;i<=N;i++)
        cout<<A[i]<<' ';
    cout<<endl;
}

Merge函数

void Merge(int A[],int p,int q,int r){
    int B[100];
    int s=p,t=q+1,k=p;
    while(s<=q && t<=r){
        if(A[s]<=A[t])
            B[k]=A[s],s++;
        else
            B[k]=A[t],t++;
        k++;
    }
    if(s==q+1)
        for(;t<=r;t++,k++)
            B[k]=A[t];
    else
        for(;s<=q;s++,k++)
            B[k]=A[s];
    for(int i=p;i<=r;i++)
        A[i]=B[i];
}

运行
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44793599/article/details/89284932