C++实现归并排序

#include <iostream>
#include <cstdlib>
using namespace std;

void print_Arr(int arr[],int n){
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " " ;
    }
    cout << endl;
}
void merge(int arr[],int tempArr[],int left,int mid,int right){
    //左侧第一个未排序的元素下标
    int l_pos = left;
    //右侧第一个未排序的元素下标
    int r_pos = mid+1;
    //临时数组下标开始的位置
    int pos = left;
    //当左右元素都不唯一时的合并
    while(l_pos <= mid && r_pos <= right){
        if (arr[l_pos] > arr[r_pos]){
            tempArr[pos++] = arr[r_pos++];
        } else{
            tempArr[pos++] = arr[l_pos++];
        }
    }
    //当右侧元素都进入数组了,只合并左侧数组
    while(l_pos<=mid){
        tempArr[pos++] = arr[l_pos++];
    }
    //当左侧元素都进入数组了,只合并右侧数组
    while(r_pos<=right){
        tempArr[pos++] = arr[r_pos++];
}
    //将辅助数组中的元素赋值给arr
    while (left<=right){
        arr[left] = tempArr[left];
        left++;
    }
}
void mSort(int arr[],int tempArr[],int left,int right){
    if (left < right){
        int mid = (left + right)/2;
        //用left和mid将数组分为最小单位,不能再被分割,即left=right时
        //返回,此时再将两个最小的单位归并,变成一个单位,完成merge(),
        //返回上一步,和另一个返回来的单位(另一个msort完成merge后)
        //共同归并
        mSort(arr,tempArr,left,mid);
        mSort(arr,tempArr,mid+1,right);
        merge(arr,tempArr,left,mid,right);
    }
}
void merge_sort(int arr[],int n){
    //分配辅助数组
    int* temp = (int*) malloc(n * sizeof (int));
    if (temp){
    	//传进去此数组的left和right
        mSort(arr,temp,0,n-1);
        free(temp);
    } else {
        cout << "error to allocate memory" << endl;
    }
}
int main(){
    int arr[8]={4,1,2,7,3,8,7,9};
    print_Arr(arr,8);
    merge_sort(arr,8);
    print_Arr(arr,8);
    return 0;
}

该说不说,确实难,对于我来说。
首先定义数组——遍历——定义暂时空间储存元素——对数组进行分治,分治到最小单位——归并——复制元素进原数组
具体的我对这个排序的理解都已经放在注释里了,至少今晚上我还对这个方法很熟,明天,那就是明天的事了,哈哈。
具体还是参考那位up的视频。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值