Sorting Algorithm-Merging Sort
2016-09-04 10:33
218 查看
Merging Sort-归并排序
Ex:
由于归并排序在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归时深度为log2n的栈空间,因此空间复杂度为O(n+logn)。
归并排序市一种稳定的排序方法,总结来说,归并排序是一种比较占用内存,但却效率高且稳定的算法。
Algorithm:
归并排序就是利用归并的思想实现排序的方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,...,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。Ex:
Code:
递归方式:自顶而下void Merge(vector<int> &v,int first,int end) //归并程序 { int len = v.size(); vector<int> temp(len); int mid = (first + end) >> 1; int k = first; int i = first; int j = mid+1; while (i<=mid&&j<=end) { if (v[i] <= v[j]) temp[k] = v[i++]; else temp[k] = v[j++]; k++; } while (i <= mid) { temp[k++] = v[i++]; } while (j <= end) { temp[k++] = v[j++]; } for (k = first; k <= end; k++) { v[k] = temp[k]; } } void Merge_Sort(vector<int> &v, int first, int end) { if (first < end) { int mid = (first + end) >> 1; Merge_Sort(v, first, mid); Merge_Sort(v, mid + 1, end); Merge(v, first, end); } }非递归方式:用变量k记录二路合并的长度,直到k大于数组长度
void Merge(vector<int> &v,int first,int mid,int end) //归并程序 { int len = v.size(); vector<int> temp(len); int k = first; int i = first; int j = mid+1; while (i<=mid&&j<=end) { if (v[i] <= v[j]) temp[k] = v[i++]; else temp[k] = v[j++]; k++; } while (i <= mid) { temp[k++] = v[i++]; } while (j <= end) { temp[k++] = v[j++]; } for (k = first; k <= end; k++) { v[k] = temp[k]; } } void Merge_Sort2(vector<int> &v, int first, int end) //非递归 { int k = 1; while (k <= (end - first)) { int l = first; while (l <= end) { int mid = l + k-1; int r = mid + k; if (r > end) r = end; Merge(v, l,mid, r); l = r + 1; } k = k*2; } }
Analysis:
我们需要将序列中所有记录扫描一遍,因此耗费O(n)时间,整个归并排序需要进行log2n次,因此,总的时间复杂度为O(nlogn),而且这是归并排序算法中最好、最坏、平均时间性能。由于归并排序在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归时深度为log2n的栈空间,因此空间复杂度为O(n+logn)。
归并排序市一种稳定的排序方法,总结来说,归并排序是一种比较占用内存,但却效率高且稳定的算法。
相关文章推荐
- 举例讲解C语言对归并排序算法的基础使用
- java实现归并排序算法
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现自顶向下的归并排序算法
- 用C语言实现从文本文件中读取数据后进行排序的功能
- Javascript中的迭代、归并方法详解
- JavaScript希尔排序、快速排序、归并排序算法
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C#递归算法之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- Java编程中实现归并排序算法的实例教程
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- js算法:Merge Sort 归并排序
- JavaScript希尔排序、快速排序、归并排序算法