C++归并排序

算法

归并排序运用的是分治递归的思想
1.将待排序元素拆分成左子序列和右子序列
2.重复操作1直到分为n个单独的元素为止一共可以分logn层
3.对每一层进行归并排序
归并算法:
1.创建一个临时数组存放归并之后的元素:temp
2.设置三个指针分别指向左子序列的起始元素,右子序列的起始元素,临时数组:p1,p2,temp_index
3.比较p1,p2指向的内容较小的存进临时数组,p++
4.重复操作3直到p1或p2指向的子序列遍历完
5.将未遍历完的子序列按顺序存进临时数组
6.将临时数组中的元素写回待排序数组的对应位置
7.重复操作2,3,4,5,6直到所有的子序列都归并完成

图解

在这里插入图片描述
在这里插入图片描述

代码

void Merge(int* arr,int low,int mid,int high)
{
    //1.创建一个数组存储排序之后的合并元素
    int* temp = new int[high-low+1];
    if(!temp){ //内存分配失败
        cout<<"error";
        return;
    }
    //2.建立三个指针p1指向左子序列的首项,p2指向右子序列的首项,temp_index指向temp数组
    int p1=low,p2=mid+1;
    int temp_index=0;
    //3.比较左子序列p1指向的值和右子序列p2指向的值,小的放进temp中p++;重复进行此操作直到左子序列读完或右子序列读完
    while(p1<=mid&&p2<=high){
        if(arr[p1]<=arr[p2]){
            temp[temp_index++]=arr[p1++];
        }
        else{
            temp[temp_index++]=arr[p2++];
        }
    }
    //4.若左子序列没有读完,将左子序列按顺序填入temp中
    while(p1<=mid){
        temp[temp_index++]=arr[p1++];
    }
    //5.若右子序列没有读完,将右子序列按顺序填入temp中
    while(p2<=high){
        temp[temp_index++]=arr[p2++];
    }
    //6.将temp中有序的元素写入arr中
    for(int i=low;i<=high;i++){
        arr[i]=temp[i-low];
    }
    delete[] temp;
}	
void MergeSort(int* arr,int low,int high)
{
    //1.将待排序数组拆分直到拆成n个单个元素为止
    if(low<high){
        int mid=low+(high-low)/2;
        MergeSort(arr,low,mid);
        MergeSort(arr,mid+1,high);
        //2.进行归并排序
        Merge(arr,low,mid,high);
    }

}

时间复杂度

O(nlogn)

文章内的图片资源来源于:https://blog.csdn.net/aabbcc132/article/details/88540291

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读