堆排序实现
作者:互联网
堆排序实现方式,前面一种时间复杂度为N^2,暴力堆排序,下面一种是nlogn,需要记忆的一种。
public void heapSort(int Array[]) { int times = Array.length - 1; while (true) { for (int i = times; i > 0; i--) { if (Array[i] > Array[i / 2]) { int temp = Array[i]; Array[i] = Array[i / 2]; Array[i / 2] = temp; } } int temp = Array[0]; Array[0] = Array[times]; Array[times] = temp; if (times == 0) { break; } times--; } System.out.println(Arrays.toString(Array));
第二种
class Solution { public int[] sortArray(int[] nums) { //进行堆排序 //首先创建一个大顶堆 需要从第一个非叶子节点开始进行堆结构的调整 for(int i=nums.length/2-1;i>=0;i--){ //总非叶子结点开始进行调整,最后一层的非叶子结点,保证每层的下面所有层是已经调整好的大顶堆。 //构建出第一个大顶堆 需要进行调整 AdjustHeap(nums,i,nums.length); } //开始将大顶堆的第一个和最后一个交换位置 并且进行不断调整 for(int i=nums.length-1;i>0;i--){ //每一轮交换一次,最大的元素放置在末尾,实现从小到大排序 int temp = nums[i]; nums[i] = nums[0]; nums[0] = temp; //调整 此时父节点为最上面的一个为0 长度为length AdjustHeap(nums,0,i); } return nums; } public void AdjustHeap(int[] nums,int parent,int length){ //主要是调整堆顶元素到合适位置,找到最大元素到堆顶。 //将parent看成父节点即最大的节点 int temp= nums[parent]; //找出它的左孩子 int lchild = parent*2+1; //因为要不断继续往下探查 所以左孩子要加上限制 while(lchild<length){ //找出它的右孩子 int rchild = lchild+1; //如果存在右孩子 看一下它和左孩子哪个大 if(rchild<length && nums[rchild]>nums[lchild]) lchild++; //如果此时父节点的值已经大于孩子节点的值 那么可以认为不需要做调整了 直接跳出 if(temp>=nums[lchild]) break; //否则把孩子节点赋给父亲 nums[parent]=nums[lchild];//此时可以认为这三个节点已经查找完毕,继续去查找剩下的节点是否调整好 //因为需要找到最大的值 parent = lchild; lchild = lchild*2+1; } //最后找到的 此时的parent已经不是父节点了 而是temp应该存在的位置 nums[parent] = temp; }
// public void swap(int[] nums,int a,int b){ // int temp = nums[a]; // nums[a]=nums[b]; // nums[b]=temp; // } }
leetCode题目:912. 排序数组 - 力扣(LeetCode)
标签:lchild,parent,temp,nums,实现,堆排序,int,Array 来源: https://www.cnblogs.com/henuliulei/p/16340317.html