10大排序算法之【归并排序】

前几天用c++写排序算法有点上瘾,但是为了雨露均沾,不冷落我的javascript,今天决定用js写归并排序。
归并排序,其中的并字,顾名思义,及将小的东西合并为大的东西;归则指的递归,表明了合并的方法。故而,归并排序意味着这个算法是用递归的方式将小的待排序元素合并为大的有序列的元素。
为了说明这个排序的过程,我先选则一组待排序的元素【5,1,9,0,8,2】;首先现将其划分成一个个小的元素,即【5】,【1】,【9】,【0】,【8】,【2】。然后按照从小到大的次序两两合并【1,5】,【0,9】,【2,8】。继续合并【0,1,5,9】,【2,8】,继续【0,1,2,5,8,9】。至此就合并完了。
为了书写出程序,我们需要明白两点:
1.如何将大的待排序元素划分成单个元素
2.如何将两个小的排序好的元素合并为一个排序好的元素
可以这样形象的理解,要是元素的长度大于1则继续递归划分直至其长度等于一,在划分的时候给其施加合并的函数,这样递归划分完成后自然就会按照合并路线递归回来。。。本人表述能力有点差,,大家看代码吧,如果哪里不懂请留言_

var array = [5,1,9,0,8,2,7,3,6,4];

var merge_sort = function(array){

var length = array.length;

if(length ===1 )return array;

var mid   = Math.floor(length/2),
    left  = array.slice(0,mid),
    right = array.slice(mid,length);

return merge(merge_sort(left), merge_sort(right));

}

var merge = function(left, right){

var result = [],
    il     = 0,
    ir     = 0;

while( il < left.length && ir < right.length){

    if(left[il] < right[ir]){

        result.push(left[il++]);
    }else{

        result.push(right[ir++])
    }
}

while(il<left.length){

    result.push(left[il++]);
}

while(ir<left.length){

    result.push(right[ir++]);
}

console.log(result);
return result;

}

console.log(merge_sort(array));

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法 冒泡排序 选择排序 插入排序 快速排序(最常见) 希尔排序 归并排序 源码:Sorting 冒泡排序 冒...
    廖少少阅读 2,746评论 12 101
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,288评论 0 2
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,237评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,753评论 0 15
  • “早晨!”这是广东人说“早安”的意思,但不仅限于“早安”。按现代汉语,这是名词作动词用,虽然在广东话里仍可作名词,...
    原疯不动阅读 1,163评论 0 3