数据结构可视化:堆排序算法排序过程
实现一个堆排序算法,并分析其时间复杂度和空间复杂度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public class HeapSort { public static void sort(int[] arr) { int n = arr.length;
for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
for (int i = n - 1; i >= 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp;
heapify(arr, i, 0); } }
static void heapify(int[] arr, int n, int i) { int largest = i; int l = 2 * i + 1; int r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap;
heapify(arr, n, largest); } } }
|
堆排序是一种基于完全二叉树的排序算法,它利用了堆的性质来实现排序。堆排序分为两个步骤:建堆和排序。
建堆的过程可以分为两种方式:最大堆和最小堆。最大堆的特点是父节点的值大于等于其子节点的值,最小堆的特点是父节点的值小于等于其子节点的值。在建堆的过程中,我们需要从最后一个非叶子节点开始,逐个向上调整节点的位置,使得整个堆满足最大堆或最小堆的性质。
排序的过程是将堆顶元素与堆底元素交换位置,然后将堆的大小减1,重新调整堆的结构,使其满足最大堆或最小堆的性质。重复这个过程,直到堆的大小为1,排序完成。
堆排序的时间复杂度为O(nlogn)
,其中n为待排序的元素个数。建堆的时间复杂度为O(n),排序的时间复杂度为O(nlogn)。空间复杂度为O(1)
,因为堆排序算法只需要一个额外的空间来存储堆。
验证:
1 2 3 4 5 6
| public static void main(String[] args) { int[] nums = {6, 3, 5, 1, 2, 8, 4, 9}; HeapSort.sort(nums); System.out.println("nums = " + Arrays.toString(nums)); }
|