堆排序Java实现(大堆)

阳光穿透心脏的1/2处 2023-07-07 03:41 113阅读 0赞

Java实现堆排序(建立大堆的形式)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。
堆中定义以下几种操作:

最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点。
创建最大堆:将堆中的所有数据重新排序。
堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算。

代码如下:

  1. import java.util.Arrays;
  2. public class HeapSort {
  3. public static void main(String[] args) {
  4. int[] arr = new int[]{
  5. 6, 8, 3, 4, 1, 9, 0, 12, 7, 5};
  6. System.out.println(Arrays.toString(arr));
  7. heapSort(arr);
  8. System.out.println(Arrays.toString(arr));
  9. }
  10. //堆排序
  11. private static void heapSort(int[] arr) {
  12. if (arr.length <= 1 ) {
  13. return;
  14. }
  15. buildMaxHeap(arr);//建立大堆
  16. for (int i = arr.length - 1; i >= 1; i--) {
  17. swap(arr, 0, i);//进行交换
  18. maxHeap(arr, i, 0);//在进行建立大堆
  19. }
  20. }
  21. //建立大堆
  22. private static void buildMaxHeap(int[] arr) {
  23. int half = (arr.length-1)/2;
  24. for (int i = half; i >=0; i--) {
  25. maxHeap(arr,arr.length,i);
  26. }
  27. }
  28. //进行交换
  29. private static void swap(int[] arr, int i, int j) {
  30. int tmp = arr[j];
  31. arr[j] = arr[i];
  32. arr[i] = tmp;
  33. }
  34. //length 为 每次建立大堆的数组长度 i为从哪开始
  35. private static void maxHeap(int[] arr, int length, int i) {
  36. int left = 2 * i + 1;
  37. int right = 2 * i + 2;
  38. int max = i;
  39. if (left < length && arr[i] < arr[left]) {
  40. max = left;
  41. }
  42. if (right < length && arr[max] < arr[right]) {
  43. max = right;
  44. }
  45. if (max != i) {
  46. swap(arr, max, i);
  47. maxHeap(arr, length, max);
  48. }
  49. }
  50. }

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 利用实现排序

    大根堆的结构为完全二叉树 任意一颗子树的最大值在树根上,其根节点和子节点的坐标索引关系为,i位置的节点的:[具体大根堆的介绍和实现参考另外一篇文章][Link 1] 左

    相关 排序(最

    基本概念 数据结构:记录=关键值+卫星数据 关键值:待排序的值 卫星数据:与关键值一同存取 原址排序:输入数组中仅有常数个(少量)元素需要在排序过程中存储在数组之外