博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序
阅读量:6032 次
发布时间:2019-06-20

本文共 2569 字,大约阅读时间需要 8 分钟。

归并排序思路:就是将数组拆成一个个有序的数组,然后再合并有序数组的过程。

最开始数组中有序数组怎么找到? 像插入排序一样,将一个元素看成一个有序的数组,所以,归并就是先将数组分为一个个的元素,再合并起来。

举个例子:4 7 3 2 5 6 1

先递归到最深处

4 7 调用函数Sort将这两个数组合并起来     :4 7

3 2 调用函数Sort将这个两个数合并起来     :2  3

然后返回上一层将这两个数组  4 7 和 2 3   合并起来  :2 3 4 7

5 6 调用函数Sort将这个两个数合并起来   :5  6

1 直接返回。

返回上一层将这两个数组    5 6 和 1     合并起来    :1 5 6

返回上一层将   2 3 4 7 和  1 5 6合并起来    :1 2 3 4 5 6 7

代码:

void Sort(int* arr,int low,int high)//把两个数组归并起来{    int mid = low + (high-low)/2;    int flag = low;    int* tmp = (int*)malloc(sizeof(int)*(high-low+1));    int id = 0;    int j = mid+1;    while(low <= mid && j <= high)    {        if(arr[low] <= arr[j])        {            tmp[id++] = arr[low];            low++;        }        else        {            tmp[id++] = arr[j];            j++;        }    }    while(low <= mid)//前面的还有值    {            tmp[id++] = arr[low++];    }    while(j <= high)//后面的还有值    {            tmp[id++] = arr[j++];    }    for(int i = 0;i < high-flag+1;i++)    {        arr[flag+i] = tmp[i];    }    free (tmp);    tmp = NULL;}void MergeSort(int* arr,int low,int high){    if(arr == NULL || low >= high) return;    int mid = low+(high-low)/2;    //先拆分    MergeSort(arr,low,mid);    MergeSort(arr,mid+1,high);    //再合并    Sort(arr,low,high);}

 多路归并:

void MergeSort(int*arr, int nbegin,int nend,int n){    int* flag = new int[n];    int length = nend - nbegin+1;    for(int i = 0; i < n;i++)//每一路的开始下标        flag[i] = nbegin + length*i/n;    int* tmp = new int[length];    int id = 0;    vector
vec; for(int i = 0; i < n; i++) vec.push_back(arr[flag[i]]); int cnt = n; while(cnt && vec.size() >= n) { push_heap(vec.begin(),vec.end(),greater
());//小根堆 tmp[id++] = vec[0]; for(int i = 0; i < n;i++) { if(flag[i] == -1) { continue; } if(vec[0] == arr[flag[i]]) { pop_heap(vec.begin(),vec.end(),greater
());//小根堆 vec.pop_back(); flag[i] = flag[i] + 1; if(flag[i] <= nbegin + length*(i+1)/n-1)//将标记向下移 { vec.push_back(arr[flag[i]]); } else//结束一路 { flag[i] = -1; cnt--; } break; } } } for(int i = 0; i < vec.size();i++)//根已经放过了 { tmp[id++] = vec[i]; } for(int i =0; i < id;i++ )//放回原数组 arr[nbegin+i] = tmp[i]; delete[] tmp; delete[] flag;}

 

转载于:https://www.cnblogs.com/Lune-Qiu/p/9116169.html

你可能感兴趣的文章
解决chrome浏览器us-yahoo.com搜索劫持
查看>>
C语言处理字符串及内存操作
查看>>
shell脚本--02循环与条件
查看>>
CDQZ集训DAY8 日记
查看>>
练习题
查看>>
Java中的集合类
查看>>
邮箱的正则表达式
查看>>
div+css命名规范大全
查看>>
某油企产成品标准成本估算逻辑
查看>>
Spring中property-placeholder的使用与解析
查看>>
DataGridView控件60招(一)
查看>>
当前目录下所有代码中查找
查看>>
LigerUI 使用教程表格篇
查看>>
设置层叠效果
查看>>
人生何为贵?
查看>>
App3种开发方式的优劣分析:原生、混合和H5
查看>>
PIE SDK Geometry的坐标转换
查看>>
mvc重定向方式详解
查看>>
[转]GCD介绍
查看>>
BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)
查看>>