详解如何在Java中实现堆排序算法

网友投稿 283 2022-08-17


详解如何在Java中实现堆排序算法

目录算法描述实现代码测试代码

算法描述

堆排序算法的描述如下:

将待排序的数组调整为最大堆,此时未排序的长度 N 为数组的长度,调整的过程就是倒序将数组的前 N/2 个元素下沉的过程,每次下沉都会将较大的元素带到上面,最终将数组变为最大堆;弹出最大堆的堆顶元素并将其移动到数组的最后面,将原本最后面的元素放到堆顶,然后将未排HFXTIUsGG序的长度 N - 1,调整数组的前 N 个元素为最大堆;重复步骤 2 直到未排序的长度为 0.

实现代码

package com.zhiyihttp://yo.collection.sort;

import java.util.Arrays;

public class HeapSort extends BaseSort {

@Override

public void sort(Comparable[] array) {

int N = array.length;

// 创建最大堆

for (int i = N / 2; i >= 0; i--) {

sink(array, i, N);

}

// 就地排序

while (N > 0) {

// 将最大的元素移动到数组的尾部,同时将未排序的长度-1

swap(array, 0, --N);

HFXTIUsGG // 调整最大堆

sink(array, 0, N);

}

}

/**

* 下沉元素

*

* @param array 数组

* @param k 下沉的元素索引

*/

private void sink(Comparable[] array, int k, int N) {

while (2 * k + 1 < N) {

int j = 2 * k + 1;

if (j < N - 1 && less(array[j], array[j + 1])) j++;

if (!less(array[k], array[j])) break;

swap(array, k, j);

k = j;

}

}

}

抽象类 BaseSort 的代码为:

package com.zhiyiyo.collection.sort;

/**

* 数组排序抽象类

*/

public abstract class BaseSort {

public abstract void sort(Comparable[] array);

/**

* 交换数组元素

*

* @param array 数组

* @param a 数组下标 a

* @param b 数组下标 b

*/

protected static void swap(Comparable[] array, int a, int b) {

Comparable tmp = array[a];

array[a] = array[b];

array[b] = tmp;

}

protected static boolean less(Comparable a, Comparable b) {

return a.compareTo(b) < 0;

}

}

测试代码

package com.zhiyiyo.collection.sort;

import org.junit.Test;

import java.util.Arrays;

public class HeapSortTest {

@Test

public void sort() {

Integer[] array = {5, 10, 9, 6, 8, 7, 2, 1, 4, 3};

new HeapSort().sort(array);

System.out.println(Arrays.toString(array));

}

}

最终排序结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],以上~


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:AQS(AbstractQueuedSynchronizer)抽象队列同步器及工作原理解析
下一篇:Netty启动流程注册多路复用源码分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~