简介

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

  1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
  2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

堆排序的平均时间复杂度为 Ο(nlogn)。&&&&&&&&ni

算法步骤

  1. 将待排序序列构建成一个堆 H[0……n-1],根据(升序降序需求)选择大顶堆或小顶堆
  2. 把堆首(最大值)和堆尾互换
  3. 把堆的尺寸缩小 1,并调用 heapify,目的是把新的数组顶端数据调整到相应位置
  4. 重复步骤 2,直到堆的尺寸为 1。

代码

  1. package com.diodi.sort;
  2. import java.util.Arrays;
  3. /**
  4. * @author diodi
  5. * @create 2021-10-20-14:43
  6. */
  7. public class dui{
  8. /**
  9. * 主排序方法
  10. * @param arr
  11. * @return
  12. */
  13. public static int[] sort(int[] arr){
  14. int[] list = Arrays.copyOf(arr, arr.length);
  15. int len = list.length;
  16. buildMaxHeap(list, len);
  17. for (int i = len-1; i >0; i--) {
  18. swap(list, 0, i);
  19. len--;
  20. heapify(list, 0, len);
  21. }
  22. return list;
  23. }
  24. //构建大顶堆
  25. private static void buildMaxHeap(int[] list , int len) {
  26. for (int i = (int) Math.floor(len / 2); i >=0; i--) {
  27. heapify(list, i, len);
  28. }
  29. }
  30. //将调整大顶堆
  31. private static void heapify(int[] list , int i,int len){
  32. int left = 2*i +1;
  33. int right = 2*i +2;
  34. int temp = i;
  35. if (left<len && list[left]>list[temp]){
  36. temp = left;
  37. }
  38. if (right<len && list[right]>list[temp]){
  39. temp = right;
  40. }
  41. if (temp != i) {
  42. swap(list, i, temp);
  43. heapify(list, temp, len);
  44. }
  45. }
  46. //交换定点和末尾叶子节点位置
  47. private static void swap(int[] list,
  48. int i,
  49. int j) {
  50. int temp = list[i];
  51. list[i] = list[j];
  52. list[j] = temp;
  53. }
  54. }

测试

10w个随机数排列
image.png