js实现归并排序

function merge(s_arr, d_arr, start, middle, end){
  var s_temp = start;
  var m_temp = middle+1;
  var temp;
  var d = start;
  for(;s_temp <= middle && m_temp <= end; d++){
    if(s_arr[s_temp] < s_arr[m_temp]){
      d_arr[d] = s_arr[s_temp];
      s_temp++;
    }else{
      d_arr[d] = s_arr[m_temp];
      m_temp++;
    }
  }
  if(s_temp <= middle){
    for(temp = 0;temp <= middle -s_temp; temp++){
      d_arr[d + temp] = s_arr[s_temp + temp];
    }
  }
  if(m_temp <= end){
    for(temp = 0;temp <= end -m_temp; temp++){
      d_arr[d+temp] = s_arr[m_temp + temp];
    }
  }
}
// var arr1 = [1, 4, 8, 10, 2, 5, 9, 11];
// var arr2 = [];
// merge(arr1, arr2, 0, 1, 2);
function merge_sort(arr){
  sort_merge(arr, arr, 0, arr.length-1);
}
function sort_merge(s_arr, d_arr, start, end){
  if(start == end){
    d_arr[start] = s_arr[start];
  }else{
    var m = parseInt((start + end)/2);
//console.log(m);
    sort_merge(s_arr, d_arr2, start, m);
    sort_merge(s_arr, d_arr2, m + 1, end);
    merge(d_arr2, d_arr,start, m, end);
  }
}
merge_sort(arr)
console.log(arr);

归并排序要点

1.将要排序的数组递归的进行切分为start,middle,end三部分

2.将排好序的start-middle与middle-end合并为一个数组

function merge_sort(arr){
    _sort_merge(arr, arr, 0, arr.length -1);
}

function _sort_merge(src, desc, start, end){
    var tmp_arr = [];
    if(start == end){
        desc[start] = src[start];
    }else{
        var m = parseInt((start + end)/2);
        _sort_merge(src, tmp_arr, start, m);
        _sort_merge(src, tmp_arr, m + 1, end);
        merge(tmp_arr, desc, start, m, end);
    }
}

function merge(src, desc, start, m, end){
    var i = start,j = m + 1, index = start;
    while(i <= m && j <= end){
        if(src[i] > src[j]){
            desc[index] = src[i];
            index++;
            i++;
        }else{
            desc[index] = src[j];
            index++;
            j++;
        }
    }
    while(i <= m){
        desc[index] = src[i];
        index++;
        i++;
    }
    while( j <= end){
        desc[index] = src[j];
        index++;
        j++;
    }
}
var arr = [22, 31, 1, 9, 99, 68, 55, 30];
merge_sort(arr);
console.log(arr);

 

posted @ 2015-12-12 15:45  天空中的蜂蜂  阅读(813)  评论(0编辑  收藏  举报