Javascript实现归并排序

来源:互联网 发布:centos ntfs 挂载 编辑:程序博客网 时间:2024/05/21 04:22

归并排序

将一个数组二等分, 比如原数组为[9,2,6,4,8,10,1,3];

分成 [9,2,6,4]  [8,10,1,3]

如果数组长度大于2  继续往下分

[9,2]    [6,4];

长度小于2的话    就对无法再分的数组进行排序

[2,9]   [4,6]

排序好后  进行归并   ,就是将两个数组按顺序凑到一个新数组里

这时候申请一个新数组,长度为两个数组的和  即长度为4的数组   arr =  [ ?,? ,? ,? ]

将这四个数  进行比较  放入新数组里  

 arr1 = [2,9]   arr2 = [4,6];

 L1为 arr1的 数组下标计数     L2为 arr2的数组下标计数   初始都为0

进行比较    如果  arr1[L1]> arr2[L2]  2>4  不成立就把  arr1[L1]放入 arr中  然后 L1加1 

然后再进行比较  arr1[L1]>arr2[L2]   9>4  成立   就把  arr2[L2]放入 arr中   L2加一  

也就是将他们之中  最小的那个放入新数组中,然后下标加一,再进行比较,一直到新数组被填满 返回新数组


下面是代码

var shuzu = new Array(9,6,20,4,2,99,44,325);var guibing = function(arr){//分割数组 如果该数组长度大于2  继续分割  否则返回一个排序好的长度为 1或2的数组var divide = function(arr,length){var mid = Math.round((length)/2);if(length>2){var arr1 = arr.splice(0,mid);return merge(divide(arr1,arr1.length),divide(arr,arr.length));}else{return sortArr(arr,length);}}//归并排序 arr1,arr2是两个已排序好的数组   对两个数组进行排序var merge = function (arr1,arr2){console.log('归并的两个数组:',arr1,arr2);var arr0 = new Array(arr1.length+arr2.length);var L1 = 0;//数组1的计数器var L2 = 0;//数组2的计数器for(var i = 0,L1=0,L2=0;i<arr0.length;i++){if(L1==arr1.length){arr0[i] = arr2[L2];L2++;continue;}if(L2==arr2.length){arr0[i] = arr1[L1];L1++;continue;}if(arr1[L1]<arr2[L2]){arr0[i] = arr1[L1];L1++;}else{arr0[i] = arr2[L2];L2++;}}console.log('归并结果',arr0);return arr0;}//把长度为1 或 2 的数组排序好var sortArr = function(arr,length){if(length!=1&&arr[0]>arr[1]){var temp = arr[1];arr[1] = arr[0];arr[0] = temp;}console.log('排序好的数组:',arr);return arr;}return divide(arr,arr.length);}var result1 = guibing(shuzu);console.log(result1);


1 0