[十大算法JavaScript的实现] 二、堆排序

目录

一、思想

二、实现

三、结果


一、思想

利用堆/二叉树结构特点进行交换,将数组类比为一个完全二叉树,依次对二叉树进行节点比较与交换,从子节点往上进行比较,将值较大的子节点交换到父节点,从下往上依次比较使得最大值最终到达根节点。然后,将根节点与末尾节点交换,移除末尾节点(作为当前堆最大值)

二、实现

js

 /**
  * 对数列list进行堆排序 
  */
 let heapSort = (list) => {
  let dep = findTreeDep(list.length);
  for (let i = dep; i >= 1; i--) {
   for (let indx = Math.pow(2, i - 1); indx <= (Math.pow(2, i) - 1); indx++) {
    sortTri(list, indx);
   }
  }
  return list;
 }
 /**
  * 针对节点进行二叉树数据比较使最大数交换到父节点
  * @param list [数列]
  * @param t  [父节点索引] 
  */
 let sortTri = (list, t) => {
  let l = t * 2 - 1;
  let r = t * 2 + 1 - 1;
  t--;
  let t_val = list[t];
  let l_val = list[l];
  let r_val = list[r];
  if (l_val) {
   if (r_val) {
    if (l_val > t_val && l_val >= r_val)[list[t], list[l]] = [list[l], list[t]]
    else if (r_val > t_val && r_val >= l_val)[list[t], list[r]] = [list[r], list[t]];
   } else {
    if (l_val > t_val)[list[t], list[l]] = [list[l], list[t]];
   }
  }
 }
 // 找到树高-1 
 let findTreeDep = (length) => {
  let dep = 1;
  while (Math.pow(2, dep) < length || (length == 2 && Math.pow(2, dep) == length)) {
   dep++;
  }
  return dep - 1;
 }
 //模拟输入  
 let input = [1, 2, 4, 89, 3, 42, 4, 74, 5, 20, 6, 8, 7];
 console.log('Input: ', input)
 let result = [];
 while (input.length > 0) {
  input = heapSort(input);
  console.log('heap: ', input);
  [input[0], input[input.length - 1]] = [input[input.length - 1], input[0]];
  result.push(input[input.length - 1]);
  input.length = input.length - 1;
 }
 console.log('Output: ', result)

 

三、结果

[十大算法JavaScript的实现] 二、堆排序_第1张图片

 

你可能感兴趣的:(数据结构与算法,堆排序,JavaScript,算法)