堆排序

xiaoxiao2021-02-28  113


堆排序从简单排序算法基础上改进得到,也是一趟一趟从无序区中选择最小的记录放到有序区中。 大根堆:每个结点都不小于其孩子结点 小更对:每个结点都不大于其孩子结点

堆排序算法思想:先将array[0..n-1]调整为堆,array[0]为最大记录,然后交换array[0]和array[n-1],将最大记录归位。然后再将array[0..n-2]调整为堆,继续交换array[0]和array[n-2]…反复进行,直到只有一个记录,他便是最小的记录。

堆排序总结为两步:初始建堆,记录归位

筛选算法:

public void sift(int[] array, int low, int high) { int i = low, j = 2 * i + 1; int temp = array[i]; while (j <= high) { if (j < high && array[j] < array[j + 1]) j++; if (temp < array[j]) { array[i] = array[j]; i = j; j = 2 * i; } else break; } array[i] = temp; }

堆排序算法:

public void heapSort(int[] array) { int n = array.length; //反复调用筛选算法来完成出书建堆 for (int i = n / 2 - 1; i >= 0; i--) sift(array, i, n - 1); //记录归位,然后继续调整堆 for (int i = n - 1; i > 0; i--) { int temp = array[i]; array[i] = array[0]; array[0] = temp; sift(array, 0, i - 1); } } //筛选算法 public void sift(int[] array, int low, int high) { int i = low, j = 2 * i + 1; int temp = array[i]; while (j <= high) { if (j < high && array[j] < array[j + 1]) j++; if (temp < array[j]) { array[i] = array[j]; i = j; j = 2 * i; } else break; } array[i] = temp; }
转载请注明原文地址: https://www.6miu.com/read-27045.html

最新回复(0)