Java 堆排序

72 阅读2分钟

image.png 开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

前序

上一篇: 快速排序

堆排序

堆理论

说实话对于堆排序不是很好理解... 首先我们得大概知道堆这类的数据结构,我们可以通俗的来讲可以把金字塔就看成一个堆结构它就是一堆在那里对吧 ,那我们虚化一下:

image.png 这样就是很好理解了 就是一堆东西...我暂时的是一个比较规整的,其实我们也可以往树方向去理解。

百度百科

image.png

堆排序

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

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

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

算法图解

image.png

实践

coding

/***
 * heapSort 测试
 */
@Test
public void heapSortTest() {

    int[] ints = {1, 3, 5, 8, 2, 2, 7, 7, 6, 88, 23, 56, 21, 15};
    System.out.println("原始数组数据");
    for (int i = 0; i < ints.length; i++) {
        System.out.print(ints[i] + ",");
    }
    long l = System.nanoTime();
    //核心排序算法
    int len = ints.length;

    buildMaxHeap(ints, len);
    for (int i = len - 1; i > 0; i--) {
        swap(ints, 0, i);
        len--;
        heapify(ints, 0, len);
    }

    // 使用纳秒计算时间信息
    System.out.println("耗时" + (System.nanoTime() - l));
    System.out.println("排序之后的数据");
    for (int i = 0; i < ints.length; i++) {
        System.out.print(ints[i] + ",");
    }
}

/**
 * @param arr
 * @param len
 */
private void buildMaxHeap(int[] arr, int len) {
    for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
        heapify(arr, i, len);
    }
}

/**
 * 堆化
 *
 * @param arr
 * @param i
 * @param len
 */
private void heapify(int[] arr, int i, int len) {
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;

    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }

    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        swap(arr, i, largest);
        heapify(arr, largest, len);
    }
}

测试结果

image.png

排序算法总结

image.png

Ending

暂时后面的三个我就先欠着了,等找机会补全把 往后会出关于spring cloud 全家桶相关的文章,高并发编程相关的内容