归并排序及其优化
栏目:公司新闻 发布时间:2024-04-29
Q:什么是归并排序?A:它是建立在归并操作上的一种有效的排序算法;是采用分治法的一个非常典型的应用;是一种稳定的要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。优点?它能保证将任意长度为N的数组排序所需时

Q:什么是归并排序?
A:它是建立在归并操作上的一种有效的排序算法;是采用分治法的一个非常典型的应用;是一种稳定的

要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。

优点?它能保证将任意长度为 N 的数组排序所需时间和 NlogN 成正比;

缺点?所需的额外空间和 N 成正比。

Q:为什么需要原地归并?
A:因为用归并将一个大数组排序时,需要进行多次归并,而且每次归并会都创建一个新数组来存储排序结果会带来问题。

Q:原地归并实现了什么?
A:可以先将前半部分排序,再将后半部分排序,然后数组中移动元素而不需要使用额外的空间(将两个有序的数组归并为一个有序的数组)

Q:如何实现归并?
A:创建一个适当大小的数组,然后将两个输入数组中的元素一个个从小到大方法这个数组中。

代码实现
根据排序算法类的模板实现选择排序(提醒:点蓝字查看详情)

 
 

由于以上的原地归并只能将两个有序的数组归并成一个有序的数组,所以得基于原地归并的抽象去实现一种递归归并。

要对子数组 arr[lo…hi] 进行排序,先将它分为 arr[lo…mid] 和 arr[mid+1…hi] 两部分,分别通过递归调用将它们单独排序,最后将有序的子数组归并为最终的排序结果。

Q:为什么它能将正确的排序?
A:如果它能将两个子数组排序,那么它就可以通过归并两个子数组来将整个数组排序。

运行轨迹<

平台注册入口