下面要给大家带来的就是和堆排序算法相关的内容,一起来看看如何java实现吧!
先来看一下原始堆
堆排序算法
首先,构造出初始堆,从最后一个非叶节点开始调整,随后,选出叶子节点当中,比自己大的一个交换。
假如,交换之后的叶子节点不满足堆,那么就继续进行调整。
这里的话因为20和16交换之后导致了16不满足堆的性质,所以就要重新进行调整。
在初始堆构造好了之后,再把堆头元素交换到堆尾。
堆尾的元素已经是有序的,之后就一直进行重复,直到所有的都有序。
20已经是最大的了,将交换到堆尾。
之后,再从根节点3进行调整,之后,每次挑选出最大的放到堆尾,一直到所有的元素有序。
下面是java代码/**
* @author: gethin
* @create: 2018-05-23 16:21
* @description: 常用排序算法
**/
public class Sort
{
public static void main(String[] args)
{
int[] nums = {
16
, 7
, 3
, 20
, 17
, 8
};
headSort(nums);
for (int num: nums)
{
System.out.print(num + " ");
}
}
/**
* 堆排序
*/
public static void headSort(int[] list)
{
//构造初始堆,从第一个非叶子节点开始调整,左右孩子节点中较大的交换到父节点中
for (int i = (list.length) / 2 - 1; i >= 0; i--)
{
headAdjust(list, list.length, i);
}
//排序,将最大的节点放在堆尾,然后从根节点重新调整
for (int i = list.length - 1; i >= 1; i--)
{
int temp = list[0];
list[0] = list[i];
list[i] = temp;
headAdjust(list, i, 0);
}
}
private static void headAdjust(int[] list, int len, int i)
{
int k = i, temp = list[i], index = 2 * k + 1;
while (index
{
if (index + 1
{
if (list[index]
{
index = index + 1;
}
}
if (list[index] > temp)
{
list[k] = list[index];
k = index;
index = 2 * k + 1;
}
else
{
break;
}
}
list[k] = temp;
}
}
下面是堆排序的结果
今天和堆排序算法相关的代码实现就给大家分享到这里了。
你还想了解更多的java实例吗?可以继续通过本站来进行了解哦。
推荐阅读: