归并排序算法原理分析与代码实现
来源:互联网 发布:中国的未来是一群正知 编辑:程序博客网 时间:2024/05/21 00:00
归并排序算法原理分析与代码实现
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
- 归并排序基本原理
- 归并排序基本思想
- 举例说明归并排序的排序过程
- 1待排序列141215131116
- 待排序列25574837129286
- 归并排序实现源码
归并排序基本原理
通过对若干个有序结点序列的归并来实现排序。所谓归并是指将若干个已排好序的部分合并成一个有序的部分。
归并排序基本思想
设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 temp (相当于输出序列)中,待合并完成后将 temp 复制回 array[low..high]中,从而完成排序。
在具体的合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较 array[i] 和 array[j] 的关键字,取关键字较小(或较大)的记录复制到 temp[p] 中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p加 1。重复这一过程直至两个输入的子序列有一个已全部复制完毕(不妨称其为空),此时将另一非空的子序列中剩余记录依次复制到 array 中即可。
若将两个有序表合并成一个有序表,称为2-路归并。
举例说明"归并排序的排序过程"
看下面归并排序的两种排序过程
1.待排序列(14,12,15,13,11,16)
假设我们有一个没有排好序的序列,那么首先我们使用分割的办法将这个序列分割成一个个已经排好序的子序列。然后再利用归并的方法将一个个的子序列合并成排序好的序列。分割和归并的过程可以看下面的图例。
先"分割"再"合并"
从上图可以看出,我们首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。
2.待排序列(25,57,48,37,12,92,86)
归并排序实现源码:
static Ret merge_sort_impl(void** storage, void** array, size_t low, size_t mid, size_t high, DataCompareFunc cmp)
{
size_t i = low;
size_t j = low;
size_t k = mid;
if((low + 1) < mid)
{
size_t x = low + ((mid - low) >> 1);
merge_sort_impl(storage, array, low, x, mid, cmp);
}
if((mid + 1) < high)
{
size_t x = mid + ((high - mid) >> 1);
merge_sort_impl(storage, array, mid, x, high, cmp);
}
while(j < mid && k < high)
{
if(cmp(array[j], array[k]) <= 0)
{
storage[i++] = array[j++];
}
else
{
storage[i++] = array[k++];
}
}
while(j < mid)
{
storage[i++] = array[j++];
}
while(k < high)
{
storage[i++] = array[k++];
}
for(i = low; i < high; i++)
{
array[i] = storage[i];
}
return RET_OK;
}
- 顶
- 16
- 踩
- 1
- 上一篇一步步将vim改造成C/C++开发环境(IDE)
- 下一篇linux GCC参数详解
- 归并排序算法原理分析与代码实现
- 归并排序算法原理分析与代码实现
- 归并排序算法原理分析与代码实现
- 归并排序算法原理分析与代码实现【图解】
- 归并排序算法原理分析与代码实现
- 归并排序分析与代码实现
- 归并排序算法分析与实现
- PHP实现归并排序(合并排序)--算法原理分析
- 排序算法—归并排序算法分析与实现(Python)
- 算法基础:归并排序算法原理与实现
- 算法分析(二)归并排序原理及java实现
- 【数据结构与算法】【排序】归并排序的代码实现
- 合并(归并)排序 算法原理与实现
- 归并排序原理及代码实现
- 归并排序的原理,c++代码实现
- 归并排序算法原理及JAVA实现
- 归并排序算法 C代码实现
- 归并排序算法 C代码实现
- muduo源码学习(21)-TcpSever/TcpConnection
- jQuery实现多个邮箱格式验证,多个邮箱需使用英文逗号分隔
- Unrecognized field , not marked as ignorable
- go 语言怎么写test测试
- python入门(三十七):multiprocessing模块
- 归并排序算法原理分析与代码实现
- 表格增加行,增加按钮跟随在每一新增行的后面
- AI——人工智能,程序员的末路?
- 通过IP地址获取当前地理位置(省份)的接口
- Intel FFmpeg QSV安装
- java 同步锁(synchronized)
- 绑定微信以及获取openId
- linux 变量
- 2017 Multi-University Training Contest