图解JavaScript合并排序.docx_第1页
图解JavaScript合并排序.docx_第2页
图解JavaScript合并排序.docx_第3页
图解JavaScript合并排序.docx_第4页
图解JavaScript合并排序.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

合并排序是一个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语言实现代码如下:01#include 02 /合并过程03 void merge(int data,int start,int mid,int end)04 05 int *tmpLeft,*tmpRight;06 int leftSize,rightSize;07 int l,r,j;08 printArray(data,8);09 printf(n);10 l = 0;11 r = 0;12 j = 0;13 leftSize = mid - start + 1;14 rightSize = end - mid;15 tmpLeft = (int *)malloc(leftSize * sizeof(int);16 tmpRight = (int *)malloc(rightSize * sizeof(int);17 while(j leftSize)18 19 tmpLeftj = datastart + j;20 j+;21 22 j = 0;23 while(j rightSize)24 25 tmpRightj = datamid + 1 + j;26 j+;27 28 j = 0;29 while(l leftSize & r rightSize)30 31 if(tmpLeftl tmpRightr)32 33 datastart + j+ = tmpLeftl+;34 35 else36 37 datastart + j+ = tmpRightr+;38 39 40 while(l leftSize)41 42 datastart + j+ = tmpLeftl+;43 44 while(r rightSize)45 46 datastart + j+ = tmpRightr+;47 48 free(tmpLeft);49 free(tmpRight);50 51void merge_sort(int data,int start,int end)5253 int mid;54 if(start 0 & right.length 0)05 06 if (left0 right0)07 08 result.push(left.shift();/把最小的最先取出,放到结果集中09 10 else11 12 result.push(right.shift();13 14 15 return result.concat(left).concat(right);/剩下的就是合并,这样就排好序了1617function mergeSort(array)1819 if (array.length = 1) 20 21 return array;22 23 var middle = Math.floor(array.length / 2),/求出中点24 left = array.slice(0, middle),/分割数组25 right = array.slice(middle);26 return merge(mergeSort(left), mergeSort(right);/递归合并与排序27ruby版本:01def merge(left, right)02final = 03until left.empty? or right.empty?04final ( left.first right.first ? left.shift : right.shift )05end06final + left + right07end08def mergeSort(array)09return array if array.size 210left = array.first(array.size/2)11right = array.last(array.size - array.size/2)12merge(mergeSort(left), mergeSort(right)13end可运行版本:0102function merge(left, right)03 04 var result = ; 05 while (left.length 0 & right.length 0)06 07 if (left0 right0)08 09 result.push(left.shift();/把最小的最先取出,放到结果集中 10 11 else12 13 result.push(right.shift(); 14 15 16 return result.concat(left).concat(right);/剩下的就是合并,这样就排好序了 17 18function mergeSort(array)19 20 if (array.length = 1) 21 22 return array; 23 24 var middle = Math.floor(array.length / 2),/求出中点 25 left = array.slice(0, middle),/分割数组 26 right = array.slice(middle); 27 return merge(mergeSo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论