归并排序
来源:互联网 发布:淘宝卖男童还好做吗 编辑:程序博客网 时间:2024/06/11 03:39
在js中,采用的是自上而下的归并排序。原理:注:我们将每次经行合并排序的两个数组看成左右数组。左数组中的内容在原始数组中则在右数组的左侧。第一步:将数组分割为数个一个内容为一组的数组。//这一步并不是我们所想的那样一下子把原始数组分割成功,而是通过step(步长)来获取原始数组中的每一项。第二步:先两两为一组进行合并排序,然后四个四个为一组进行合并排序,依次类推,如果有成单元素则放到最后与前面合并排序好的数组进行合并排序。实际在整个代码中并没有体现出第一步,而是直接进行的第一步,因为我们可以控制步长来获得相对应数量的内容。若想更好理解,需按照算法动笔画一画每一次排序的过程,方能掌握。具体算法和注释如下/*归并排序 在js中是自底而上的,不是自顶而下*/function mergeSort(arr){ var len = arr.length; if(len < 2){ return; } var left,right,step = 1;//初始化步长step为1 while(step < len){ left = 0; right = step; while(right + step <= len){ var count = right + step;//表示我们一共传过去多少内容 mergeArrays(arr,left,right,count,step);//进行合并排序 left = right + step; right = left + step; } if(right < len){//若数组有成单内容,则最后与前面合并排序好的数组经行合并排序 mergeArrays(arr,left,right,len,step); } step *= 2;//步长乘2 }}function mergeArrays(arr,startLeft,startRight,count,step){ var leftArr = new Array(step);//设置左数组 var rightArr = new Array(step);//设置右数组 //注:我们将每次经行合并排序的两个数组看成左右数组。 var indexLeft = startLeft;//初始化左数组初始下标 for(var i = 0;i < step;i++){//拿到左数组对应的内容 leftArr[i] = arr[indexLeft]; indexLeft++; } var rightIndex = startRight;//初始化右数组初始下标 for(var j = 0;j < step;j++){//拿到左数组对应的内容 rightArr[j] = arr[rightIndex]; rightIndex++; } //设置边界值 leftArr[leftArr.length] = Infinity; rightArr[rightArr.length] = Infinity; //设置leftArr和rightArr下标 var left = right = 0; //通过比较左右数组中的内容对原始数组进行排序,用的是直接赋值 for(var index = startLeft;index < count;index++){ if(leftArr[left] <= rightArr[right]){ arr[index] = leftArr[left]; left++; }else{ arr[index] = rightArr[right]; right++; } }}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 一个web请求的艰辛历程
- 汇编程序:这是一个假游戏
- 深入理解盒子模型——CSS之BFC详解
- Centos7环境安装下安装Apache+php7+mysql详细步骤
- Java内存管理机制详解
- 归并排序
- Ubuntu快捷操作
- 操作系统考试大纲
- 《30天自制操作系统》跳出工具限制! 之 img硬盘映像制作
- Redis的AOF功能
- 【centos】 error: command 'gcc' failed with exit status
- IMWeb提升营Day4 | 训练题22:从上往下打印二叉树
- Linux设备驱动之LCD显示摄像图像之一框架与准备工作
- 2017计蒜之道初赛第四场-商汤科技的安全令牌