算法导论学习笔记(二):合并排序
来源:互联网 发布:刻录光盘可启动数据 编辑:程序博客网 时间:2024/06/07 19:43
在前一篇博客中已经提到了插入排序,这里继续介绍下另一种比较高效的排序:合并排序。合并排序用到了分治思
想,其时间复杂度为O(NlgN)。合并算法的关键在于合并。
合并排序的的基本步骤如下:
1.把待排序的数组分为左数组和右数组
2.对左数组和右数组进行迭代排序
3.将左数组和右数组进行合并
显然这些基本步骤符合分治模式在每一层递归上的三个步骤:分解、解决、合并。
每步的实现代码如下:
1.分解数组及进行迭代操作
void merge_sort (int a[], int p, int r){if (p < r){int q = (p + r) / 2;merge_sort (a, p, q);merge_sort (a, q + 1, r);merge (a, p, q, r);}}
2.对两个排好序的左右数组合并操作
a).实现一:
void merge (int a[], int p, int q, int r){int i, j;int n, m;n = q - p + 1;m = r - q;int* Left = new int[n + 1];int* Right = new int[m + 1];for (i = 0; i < n; i++)Left[i] = a[p + i];for (j = 0; j < m; j++)Right[j] = a[q + j + 1];Left[i] = Right[j] = INT_MAX;i = j = 0;for (int k = p; k <= r; k++){if (Left[i] < Right[j]){a[k] = Left[i++];}else{a[k] = Right[j++];}}delete Left;delete Right;}b).实现二:
void merge (int a[], int p, int q, int r){int i, j, k;int n, m;n = q - p + 1;m = r - q;int* Left = new int[n + 1];int* Right = new int[m + 1];for (i = 0; i < n; i++)Left[i] = a[p + i];for (j = 0; j < m; j++)Right[j] = a[q + j + 1];i = j = 0;for (k = p;i < n && j < m; k++){if (Left[i] < Right[j]){a[k] = Left[i++];}else{a[k] = Right[j++];}}if (i < n){for (int x = 0; x < n - i; x++)a[k++] = Left[i + x];}if (j < m){for (int x = 0; x < m - j; x++)a[k++] = Right[j + x];}delete Left;delete Right;}
- 算法导论学习笔记(二):合并排序
- 归并排序-《算法导论》学习笔记二
- 算法导论学习笔记——合并排序
- 死磕算法导论(二)合并排序
- 算法导论笔记之----合并排序
- 算法导论学习日记(3)--合并排序
- 学习算法导论-合并排序
- 算法导论学习笔记(二) 初稿
- 合并排序算法函数(算法导论)
- 合并排序算法函数(算法导论)
- 算法导论学习之插入排序+合并排序
- 算法导论笔记(二)
- 【算法导论】 2.3合并排序
- 【算法导论】合并排序法
- 【算法导论】排序 (二):堆排序
- 算法导论学习笔记(1)插入排序
- 算法导论学习笔记(1)---堆排序
- 算法导论学习笔记(2)---快速排序
- 二叉树遍历
- centos 安装samba 全过程
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】
- How main() is executed On Linux?
- 算法导论学习笔记(二):合并排序
- HTML5图表利器-ichartjs开源图表库
- PHP、MySQL存储显示图片
- C语言内存管理(初级)----链表
- redis代码分析
- 人体运动捕获
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- 关于CLASS , SEL, IMP的说明
- BrainFuck(图灵思想)