algorithm icon indicating copy to clipboard operation
algorithm copied to clipboard

分治思想--利用归并排序求数组的逆序对

Open JesseZhao1990 opened this issue 6 years ago • 0 comments

var arr = [1,3,20,5,2,9,6,4,80,9,4,6];

function mergeSort(arr){
  let count = 0;

  function _mergeSort(arr, start, end){
    if(start>=end){
      return;
    }
    var middle = Math.floor((start+end)/2);
    _mergeSort(arr, start, middle);
    _mergeSort(arr, middle+1, end);
    merge(arr, start, middle, end);
  }

  function merge(arr, start, middle, end){
     // 开辟临时空间,将start到end的子数组复制到此空间
     const tempArr = arr.slice(start,end+1)
     let index1 = start;
     let index2 = middle+1;

     for(var k=start; k<end; k++){
       if(index1 > middle){
         arr[k] = tempArr[index2- start];
         index2++;
       }else if(index2> end){
         arr[k] = tempArr[index1- start];
         index1++;
       }else if(tempArr[index1-start]< tempArr[index2- start]){
         arr[k] = tempArr[index1-start];
         index1++;
       }else{
        arr[k] = tempArr[index2-start];
        index2++
        count += middle - index1+1;
       }
     }
  }

  _mergeSort(arr, 0, arr.length-1);
  
  return count;
}

mergeSort(arr);

JesseZhao1990 avatar Oct 05 '19 15:10 JesseZhao1990