1. 程式人生 > 其它 >使用JavaScript 實現歸併排序

使用JavaScript 實現歸併排序

技術標籤:演算法資料結構與演算法演算法


const Compare = {
 LESS_THAN: -1,
 BIGGER_THAN: 1,
 EQUALS: 0
};
//比較函式
function defaultCompare(a, b) {
 if (a === b) {
  return Compare.EQUALS;
 }
 return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
//左右陣列排序演算法
function merge(left, right, compareFn=defaultCompare()) {
 let i = 0;//左指標
 let j = 0;//右指標
 const result = [];//用於比較後存放結果
 
 while (i < left.length && j < right.length) {
  //錯放比較後的資料
  result.push(compareFn(left[i], right[j]) === Compare.LESS_THAN ? left[i++] : right[j++]);
 }
 //拼接result和左陣列或者右陣列剩下的一部分。
 return result.concat(i < left.length ? left.slice(i) : right.slice(j));
}
//分割陣列演算法
function mergeSort(array, compareFn = defaultCompare) {
 if (array.length > 1) {
  const { length } = array;
  const middle = Math.floor(length / 2);//等分陣列,Math.floor(),向下取整
  //這裡使用遞迴呼叫自身
  const left = mergeSort(array.slice(0, middle), compareFn);//左陣列
  const right = mergeSort(array.slice(middle, length), compareFn);//右陣列
  //整合陣列
  array = merge(left, right, compareFn);
 }
 return array;
}
//測試
const arr =  [3,5,9,8,7,10,6,1];
console.log(mergeSort(arr));