归并排序

来源:互联网 发布:淘宝超级搜索 编辑:程序博客网 时间:2024/06/06 03:48

基本思想:将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后将他们 合并成一个序列。合并两个子序列的过程称为两路归并.

这里写图片描述

void _Merge(int*arr, int*tmp, int begin1, int end1, int begin2, int end2){    int index = 0;    while (begin1 <= end1&&begin2 <= end2)    {        if (arr[begin1] < arr[begin2])        {            tmp[index++] = arr[begin1++];        }        if (arr[begin2]<arr[begin1])        {            tmp[index++] = arr[begin2++];        }    }    while (begin1 <= end1)    {               tmp[index++] = arr[begin1++];    }    while(begin2 <= end2)    {               tmp[index++] = arr[begin2++];    }}void _MergeSort(int*arr,int* tmp, int begin, int end){    if (begin >= end)    {        return;    }    int middle = begin + ((end - begin) >> 1);    _MergeSort(arr, tmp,begin, middle);    _MergeSort(arr,tmp, middle+1, end);    //[begin,mid-1][mid,end]全部划分完成之后开始进行合并    _Merge(arr, tmp, begin, middle, middle + 1, end);    memcpy(arr + begin, tmp, sizeof(int)*((end - begin) + 1));}void MergeSort(int*arr, int n){    int *tmp = new int[n];    _MergeSort(arr, tmp, 0, n-1);    delete[]tmp;}
原创粉丝点击