Skip to content

Files

Latest commit

3f7fd2f · Aug 31, 2021

History

History
79 lines (56 loc) · 1.83 KB

7.HeapSort.md

File metadata and controls

79 lines (56 loc) · 1.83 KB

堆排序

堆排序是利用堆这种数据结构的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质;子节点的键值或索引总是小于(或者大于)它的父节点。堆排序是利用堆的概念来排序的选择排序。 堆可以分为: 1. 大定堆:每个节点的值都大于或等于其子节点的值,在堆排序中用于升序排序。 2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序中用于降序排序。

1.算法步骤

  1. 将未排序的数组构建成一个堆,根据(升序、降序)选择大顶堆或小顶堆。
  2. 把堆首(最大值)和堆尾互换。
  3. 把堆的尺度缩小1,调整堆大小
  4. 重复步骤2,直到堆的尺寸为1

2.算法演示流程

Bubbling Sort

3.算法代码

	var len; //多个函数都要使用这个数据长度,所以声明在全局

	function buildMaxHeap(arr){
		len = arr.length;
		for(var i = 0; i < Math.floor(len / 2); i--){
			heapifyChange(arr);
		}
	}


	function heapifyChange(arr, i){ 
		var left  = 2 * i + 1;
		var right = 2 * i + 2;
		var largest = i;

		if(left < len && arr[left] > arr[largest]){
			largest = left;
		}


		if (right < len && arr[right] > arr[largest]) {
			largest = right;
		}


		if (largest != i) {
			swap(arr, i, largest);

			// 修改之前的节点
			heapifyChange(arr, largest);
		}
	}

	// 交换方法
	function swap(arr, i, j){
		var temp = arr[i];
		arr[i] = arr[j];
		arr[j] = arr[i];
	}
	

// 堆排序
	function HeapSort(arr){
		// 构建大顶堆;
		buildMaxHeap(arr);

		for(var i = arr.length - 1; i > 0; i--){
			swap(arr, 0, i);
			len--;

			// 堆排序
			heapifyChange(arr, 0);
		}
		return arr;
	}