[Algorithm] - [sort] merge sort

Merge sort

C language code

#include <stdlib.h>
#include <stdio.h>

void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex)
{
    int i = startIndex, j=midIndex+1, k = startIndex;
    while(i!=midIndex+1 && j!=endIndex+1)
    {
        if(sourceArr[i] > sourceArr[j])
            tempArr[k++] = sourceArr[j++];
        else
            tempArr[k++] = sourceArr[i++];
    }
    while(i != midIndex+1)
        tempArr[k++] = sourceArr[i++];
    while(j != endIndex+1)
        tempArr[k++] = sourceArr[j++];
    for(i=startIndex; i<=endIndex; i++)
        sourceArr[i] = tempArr[i];
}

//内部使用递归
void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex)
{
    int midIndex;
    if(startIndex < endIndex)
    {
        midIndex = startIndex + (endIndex-startIndex) / 2;//避免溢出int
        MergeSort(sourceArr, tempArr, startIndex, midIndex);
        MergeSort(sourceArr, tempArr, midIndex+1, endIndex);
        Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
    }
}

int main(int argc, char * argv[])
{
    int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};
    int i, b[8];
    MergeSort(a, b, 0, 7);
    for(i=0; i<8; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

C ++ code

#include<iostream>
using namespace std;
void merge(int a[],int l,int r,int mid){
    int b[r-l+1];
    //b[0,mid] b[mid+1,r]
    int i,j,k;
    for(i=l;i<=r;i++)
        b[i-l]=a[i];
    i=l;
    j=mid+1;
    for(k=l;k<=r;k++){
        if(i>mid){
            a[k]=b[j-l];
            j++;
        }
        else if(j>r){
            a[k]=b[i-l];
            i++;
        }
        else if(b[i-l]>b[j-l]){
            a[k]=b[j-l];
            j++;
        }
        else{
            a[k]=b[i-l];
            i++;
        }
    }
}
void merge_sort(int a[],int l,int r){
    if(l>=r)
        return ;
    int mid=(l+r)/2;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);
    merge(a,l,r,mid);
}
int main(){
    int a[10]={3,2,4,8,1,9,0,5,7,6};
    merge_sort(a,0,9);
    for(int i=0;i<10;i++)
        cout<<a[i]<<' ';
    return 0;
}

understanding

Here Insert Picture Description

Merge process

img

Merge two ordered arrays

img

Published 34 original articles · won praise 2 · Views 909

Guess you like

Origin blog.csdn.net/Kapo1/article/details/103521808