目的:掌握合并排序的基本思想和过程、代码实现、时间复杂度
1、基本思想和过程:首先递归分解数列,然后综合数列(分治思想的典型应用) ) ) ) ) ) ) ) 65 )
)将一个数组划分为a、b两组,继续划分两组,直到每组只有一个元素。
)根据拆分过程逐步整合集团。 每个组最初只有一个因素,可以视为组内部有序,整合组可以视为整合两个有序数组的过程。
)3)对于左右两个小数列,重复步骤2,直到各区间变为一个个数。
对数组【42、20、17、13、28、14、23、15】进行合并排序,模拟的排序步骤如下所示。
步骤1 )要分割数组,必须总共分割三次(logN );
第一次分解为【42、20、17、13】、【28、14、23、15】,
第二次是【42、20】、【17、13】、【28、14】、【23、15】、
第三次是【42】、【20】、【17】、【13】、【28】、【14】、【23】、【15】;
步骤2 )采用逐步合并数组,合并两个有序数组的方法,每个算法的复杂度基本接近o(n )
第一次合并为【20,42】、【13,17】、【14,28】、【15,23】
第二次合并为【13、17、20、42】、【14、15、23、28】、
第三次合并为【13、14、15、17、20、23、28、42】
2、代码实现:
(1)辅助函数(合并两个有序数组的方法Merger(a,b ) ) ) ) ) ) ) ) ) )。
函数合并器(a,b ) {var n=a a.length; var m=b b.length; var c=[]; var i=0,j=0; while(Inj )
{if(a[I]
c.push(a[I]; elsec.push(b[j];
}while(I
c.push(a[I]; while(j
c.push(b[j];
console.log ('数组',a,'和',b,'组合使用',c ) returnc;
}
)2)合并步骤如下
功能合并_ sort (arr ) {
console.log(arr ) if ) arr.length==1) returnarrvarmid=math.floor (arr.length/2 ) ) ) ) ) )。
varleft=Arr.slice(0,mid ) var right=arr.slice (mid ) returnmerger ) merge_sort (left ) merge _ sort ) right //
}
3、时间复杂度: o(n*logn ) ) ) ) ) ) ) ) ) )。