思想

这是一种分治算法。将原始数组切分成较小的数组,直到每个小数组只有一项,然后在将小数组归并为排好序的较大数组,直到最后得到一个排好序的最大数组。

代码

function mergeSort(arr) {
const length = arr.length;
if (length === 1) { //递归算法的停止条件,即为判断数组长度是否为1
return arr;
}
const mid = Math.floor(length / 2); const left = arr.slice(0, mid);
const right = arr.slice(mid, length); return merge(mergeSort(left), mergeSort(right)); //要将原始数组分割直至只有一个元素时,才开始归并
} function merge(left, right) {
const result = [];
let il = 0;
let ir = 0; //left, right本身肯定都是从小到大排好序的
while( il < left.length && ir < right.length) {
if (left[il] < right[ir]) {
result.push(left[il]);
il++;
} else {
result.push(right[ir]);
ir++;
} } //不可能同时存在left和right都有剩余项的情况, 要么left要么right有剩余项, 把剩余项加进来即可
while (il < left.length) {
result.push(left[il]);
il++;
}
while(ir < right.length) {
result.push(right[ir]);
ir++;
}
return result;
}

性能分析

  • 时间复杂度:最好、平均、最坏O(nlogn)
  • 空间复杂度: O(n), 稳定

延伸:对比C语音的归并排序

#include<stdio.h>
#include<stdlib.h>
void Merge(int *list,int *newlist,int s,int m,int t)
{
int i,j,k;
i=s;
j=m+1;
k=s;
while(i<=m&&j<=t)
{
if(list[i]<=list[j])
{
newlist[k]=list[i];
k++;
i++;
}
else
{
newlist[k]=list[j];
k++;
j++;
}
} while(i<=m)//剩余的若是前一个序列,则其直接按并入newlist
{
newlist[k]=list[i];
i++;
k++;
}
while(j<=t)
{
newlist[k]=list[j];
j++;
k++;
}
} void MSort(int *list,int *newlist,int s,int t)
{
int *newlist2;
int m;
newlist2=(int *)malloc((t-s+1)*sizeof(int));//分配一个新数组,和list等长 if(s==t)
{
newlist[s]=list[s];
}
else
{
m=(s+t)/2;
MSort(list,newlist2,s,m);//将list[s]……list[m]递归归并为有序的newlist2[s]……newlist2[m]
MSort(list,newlist2,m+1,t);//将list[m+1]……list[t]递归归并为有序的newlist2[m+1]……newlist2[t]
Merge(newlist2,newlist,s,m,t);//将newlist2[s]……newlist2[m]和newlist2[m+1]……newlist2[t]归并到newlist[s]……newlist[t]
}
}
void MergeSort(int *list,int *newlist,int n)
{
MSort(list,newlist,0,n-1);
}
main()
{
int list[10],n=10,i,newlist[10];
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
{
scanf("%d",&list[i]);
}
MergeSort(list,newlist,10); for(i=0;i<10;i++)
{
printf("%d",newlist[i]);
} system("pause");
}

最新文章

  1. IO(二)
  2. javaWeb学习笔记
  3. Qt编程之对QGraphicsItem点击右键弹出菜单
  4. 深入理解Java内部类
  5. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(三)用户接口层之RTSP命令
  6. Android进阶(二十七)Android原生扰人烦的布局
  7. web前端安全
  8. Python find函数用法和概念
  9. Linux常用基本命令(less)
  10. 设计模式---行为变化模式之命令模式(Command)
  11. leetcode17
  12. poj2823 单调队列初步
  13. uva-188-枚举
  14. Java Web开发和Python Web开发之间的区别
  15. asyncsocket的用法
  16. laravel中facade serviceprovider的理解
  17. perl 模块的创建以及制定perl 模块的路径
  18. Spring 利用PropertyPlaceholderConfigurer占位符
  19. SQL基本数据类型等
  20. Pandas重建索引

热门文章

  1. 关于iOS开发的学习
  2. 利用JS获取地址栏的中文参数
  3. Ajax基础(二)--获取服务器文件
  4. HDU-4510-日期
  5. 转:A/B测试:实现方法
  6. Linux 下硬链接和软链接的说明
  7. css清除浮动float的几种方法
  8. 最新Mysql5.7安装教程
  9. windows server 2016 docker 之创建使用虚拟交换机
  10. Arcgis andoid开发之应用百度地图接口实现精准定位与显示