// 归并排序
// 自顶向下 归并过程
function Merge(arr, l, mid, r) {
var newArr = []
var x = l;
var y = mid +1;
while(x<= mid && y<= r){
if(arr[x] < arr[y]){
newArr.push(arr[x++])
} else{
newArr.push(arr[y++]);
}
}
while(x <= mid){
newArr.push(arr[x++]);
}
while(y <= r) {
newArr.push(arr[y++]);
}
for(var i=0,len=newArr.length; i<len ; i++) {
arr[i+l] = newArr[i]
}
}
function MergeSort(arr, l, r){
if( l >= r) {
return ;
}
var mid = Math.floor((l + r) / 2);
MergeSort(arr, l, mid);
MergeSort(arr, mid+1, r);
// 如果arr[mid] < arr[mid+1] 则说明 arr 已经有序了
if( arr[mid] > arr{mid+1}) {
Merge(arr, l, mid, r);
}
}
// 自底向上 的 归并排序算法
function MergeSortBU(arr, n) {
for(var sz=1; sz<n; sz += sz)
for(var i=0; i + sz <n; i += sz +sz)
Merge(arr, i, i+sz-1, min(i + sz + sz-1, n-1))
}
// 最小值
function min(a, b){
return a > b ? b : a;
}
自底向上的归并算法,是一个很神奇的东西
刚开始的时候,不是很理解,感觉像是颠覆了之前的想法思维
从底往上 刚开始是相邻的比较 再通过sz 的变大,比较的范围也变大了