热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图解JavaScript合并排序

合并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子。有这样一组数据,{5,4,1,22,12,32,45,21},如果对它进行合并排序的话,首先将它从中间分开,这样,它就被分成了两个数组{5,4,1,22}{12,32,45,21}。

合并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子。

有这样一组数据,{5,4,1,22,12,32,45,21},如果对它进行合并排序的话,首先将它从中间分开,这样,它就被分成了两个数组{5,4,1,22} {12,32,45,21}。

对这两个数组,也分别进行这样的操作,逐步的划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。

划分的过程如下图所示:

接下来,我们进行合并操作,依照上图,划分过程是从上到下进行的,而合并的过程是从下往上进行的,例如上图中,最下层{5},{4}这两个数组,如果按升序排列,将他们合并后的数组就是{4,5}。{1},{22}这两个子数组合并后是{1,22}。而{4,5}与{1,22},这两个数组同属一个分支,他们也需要进行合并,由于这两个子数组本身就是有序的,所以合并的过程就是,每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,前面两个数组合并后就是{1,4,5,22}。依次类推,直到合并到最上层结束,这是数据的排序已经完成了。

合并的过程如下图所示。这个过程是从下往上的。

C语言实现代码如下:

#include 
	//合并过程
	void merge(int data[],int start,int mid,int end)
    {
		int *tmpLeft,*tmpRight;
		int leftSize,rightSize;
		int l,r,j;
		printArray(data,8);
		printf("\n");
		l = 0;
		r = 0;
		j = 0;
		leftSize = mid - start + 1;
		rightSize = end - mid;
		tmpLeft = (int *)malloc(leftSize * sizeof(int));
		tmpRight = (int *)malloc(rightSize * sizeof(int));
		while(j 
  
  

Javascript版本:

function merge(left, right)
{
	var result = [];
	while (left.length > 0 && right.length > 0)
    {
		if (left[0] 
  
  

ruby版本:

def merge(left, right)
final = []
until left.empty? or right.empty?
final <<( left.first 
  
  

可运行版本:


  

运行结果:

本文地址:http://www.nowamagic.net/librarys/veda/detail/1241,欢迎访问原出处。


推荐阅读
author-avatar
mobiledu2502873617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有