From 7afb8102a2c894ea759bf24c3ec72d7f8cc1b8df Mon Sep 17 00:00:00 2001 From: qrqhuangcy Date: Mon, 4 May 2020 04:54:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=9D=9E=E9=80=92=E5=BD=92?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=A0=86=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7.heapSort.md | 32 ++++++++++++++++++++++++++++++-- src/java/main/HeapSort.java | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/7.heapSort.md b/7.heapSort.md index 394d929..1195b2a 100644 --- a/7.heapSort.md +++ b/7.heapSort.md @@ -176,7 +176,10 @@ public class HeapSort implements IArraySort { } } - private void heapify(int[] arr, int i, int len) { + /** + * 1. 递归方式堆化 + */ + private void heapifyRecursive(int[] arr, int i, int len) { int left = 2 * i + 1; int right = 2 * i + 2; int largest = i; @@ -191,8 +194,33 @@ public class HeapSort implements IArraySort { if (largest != i) { swap(arr, i, largest); - heapify(arr, largest, len); + heapifyRecursive(arr, largest, len); + } + } + + /** + * 2. 非递归方式堆化 + */ + private void heapify(int[] arr, int i, int len) { + int tmp = arr[i]; + + for (int j = i * 2 + 1; j < len; j = j * 2 + 1) { + //比较左右子结点谁更大 + if (j + 1 < len && arr[j] < arr[j + 1]) { + j++; + } + //如果子节点没父节点大,跳过 + if (arr[j] <= tmp) { + break; + } else { + //将子节点的值赋给父节点 + arr[i] = arr[j]; + //升级为新的父节点 + i = j; + } } + + arr[i] = tmp; } private void swap(int[] arr, int i, int j) { diff --git a/src/java/main/HeapSort.java b/src/java/main/HeapSort.java index 6e9dcfe..b8c04cf 100644 --- a/src/java/main/HeapSort.java +++ b/src/java/main/HeapSort.java @@ -28,7 +28,10 @@ private void buildMaxHeap(int[] arr, int len) { } } - private void heapify(int[] arr, int i, int len) { + /** + * 递归方式堆化 + */ + private void heapifyRecursive(int[] arr, int i, int len) { int left = 2 * i + 1; int right = 2 * i + 2; int largest = i; @@ -43,10 +46,35 @@ private void heapify(int[] arr, int i, int len) { if (largest != i) { swap(arr, i, largest); - heapify(arr, largest, len); + heapifyRecursive(arr, largest, len); } } + /** + * 非递归方式堆化 + */ + private void heapify(int[] arr, int i, int len) { + int tmp = arr[i]; + + for (int j = i * 2 + 1; j < len; j = j * 2 + 1) { + //比较左右子结点谁更大 + if (j + 1 < len && arr[j] < arr[j + 1]) { + j++; + } + //如果子节点没父节点大,跳过 + if (arr[j] <= tmp) { + break; + } else { + //将子节点的值赋给父节点 + arr[i] = arr[j]; + //升级为新的父节点 + i = j; + } + } + + arr[i] = tmp; + } + private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j];