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

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

归并排序是颇受欢迎的排序算法,因为他的时间复杂度恒为O(n log(n))。顾名思义,这个排序算法就是将多个排好序的数组合并成单个排好序的数组。

具体步骤如下:

  • 将待排序的数组分成左右两部分。
  • 再将这两部分分别分成左右两部分。
  • 一直分下去,直到不可分(每部分只有一个元素)。
  • 由于数组被分成许多的单个数据,比较起来就简单了,然后开始合并,合并的同时排序。
  • 持续合并直到得到排好序的数组。

下面这幅图可以帮助你理解算法过程:

merge_sort

上图中可以看到,算法将数组分为两个部分,然后再分,一直分到只有一个元素,然后合并成已排序的数组。

将两个已排序的数组合并成一个排序的数组的方法在前面已经讨论过了,不清楚的同学看一下

归并排序显然可以用分治法,算法如下:

# split in half

m = n / 2

# recursive sorts

sort a[1..m]
sort a[m+1..n]

# merge sorted sub-arrays using temp array

b = copy of a[1..m]
i = 1, j = m+1, k = 1
while i <= m and j <= n,
    a[k++] = (a[j] < b[i]) ? a[j++] : b[i++]
→ invariant: a[1..k] in final position
while i <= m,
    a[k++] = b[i++]
→ invariant: a[1..k] in final position

算法实现:

#include
//defining a function to merge 2 sorted arrays//note that the 2 arrays will be contained in a single array//as the left and right partvoid merge(int arr[], int start, int mid, int end){ // the array is as:- {start, ... ..mid, mid+1, .....end} // thus there are 2 arrays we need to merge //1st array , starting index and last index int i = start; int l1 = mid; //2nd array , starting index and last index int j = mid+1; int l2 = end; //create an auxiliary array to store the elements int len = end-start + 1; int *arr2 = (int *)malloc(sizeof(int)*len); int k = 0; //apply the algorithm to merge 2 sorted arrays while(i<=l1 && j<=l2) { if(arr[i] < arr[j]) arr2[k++] = arr[i++]; else arr2[k++] = arr[j++]; } while(i<=l1) arr2[k++] = arr[i++]; while(j<=l2) arr2[k++] = arr[j++]; //copy the auxiliary array to original array for(k = 0; k

Time Complexity: O(n log(n)) for all cases

Space Complexity: O(n) for the Sortauxiliary array

转载于:https://www.cnblogs.com/programnote/p/4723564.html

你可能感兴趣的文章
WebStorm 快键键
查看>>
Google code android 开源项目 集合
查看>>
tomcat 调优
查看>>
E - Triangle
查看>>
Web安全学习笔记(一)
查看>>
学习微信小程序之css13关于盒子外边距的合并
查看>>
C语言算法竞赛入门(二)---数组元素移动 、排序问题 、猴子选大王问题
查看>>
sas中的sql(5) 纵向操作数据集 Except、Intersect、Union、OuterUnion
查看>>
Javascript弹出对话框类
查看>>
arc 和 non-arc 的混合使用
查看>>
Tiny6410学习移植usb无线网卡(一)
查看>>
洛谷——P2656 采蘑菇
查看>>
sexi部署openstack (devstack) 、二
查看>>
[分享]OpenGL实现的翻页效果
查看>>
在WinForms中使用自定义纸张
查看>>
codeforces 721C Journey
查看>>
如何设计制作专业PPT
查看>>
Algorithm3: 获得一个int数中二进制位为1 的个数
查看>>
The Balance
查看>>
ES6第一篇:let、const、块级作用域
查看>>