博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序
阅读量:5367 次
发布时间:2019-06-15

本文共 1426 字,大约阅读时间需要 4 分钟。

堆排序

标签(空格分隔): 算法


堆实际上是一种满二叉树,所以我们可以直接利用父母节点与孩子节点之间在数组中的位置关系来操纵,而不需要真的建立一棵二叉树。

堆分为大顶堆(父节点比所有左右子孩子的排序码都要大)和小顶堆(父节点比所有左右子孩子的排序码都要小);
堆排序的过程分为2个部分:

  1. 根据输入的初始数据,建立初始堆;
  2. 通过一系列的元素交换和重新调整堆进行排序。
    假设父节点在数组中的位置为\(i\),则它的左孩子的位置为\(i*2+1\),右孩子的位置为\(i*2+2\).

代码如下:

public class HeapSort {/** * 将最大的元素向下调整,生成大顶堆 * @param start * @param end * @param heap */public static int[] siftDown(int start, int end, int[] heap) {    int i = start, j = i * 2 + 1;//令j指向左孩子    int temp = heap[i];    while(j <= end) {        if(j < end && heap[j] < heap[j+1])            j++; //令j指向较大的孩子        if(heap[i] >= heap[j])            break; //当前元素已是较大的元素        else {            heap[i] = heap[j];            i = j;            j = i * 2 + 1;        }    }    heap[i] = temp;    return heap;}/** * 堆排序 * @param heap */public static int[] heapSort(int[] heap) {    //建立初始堆,从第一个非叶节点开始调整    for(int i=(heap.length-2)/2; i>=0; i--) {        heap = siftDown(i, heap.length-1, heap);    }        //依次将大顶堆的对顶元素移动至最后,然后重新调整为大顶推    for(int i=heap.length-1; i>0; i--) {        int  temp = heap[0];        heap[0] = heap[i];        heap[i] = temp;        heap = siftDown(0, i-1, heap);            }    return heap;}public static void main(String[] args) {    // TODO Auto-generated method stub    int[] nums = {5,3,7,1,10,4};    int[] res = heapSort(nums);    System.out.println(Arrays.toString(res));}}

算法复杂度为:O(nlogn).

转载于:https://www.cnblogs.com/little-YTMM/p/5689743.html

你可能感兴趣的文章
alibaba / zeus 安装 图解
查看>>
Planned Delivery Time as Work Days (SCN discussion)
查看>>
Ubuntu:让桌面显示回收站
查看>>
Android上传头像代码,相机,相册,裁剪
查看>>
git 安装体验
查看>>
Oracle 给已创建的表增加自增长列
查看>>
《DSP using MATLAB》Problem 2.17
查看>>
if 循环
查看>>
uva 111 History Grading(lcs)
查看>>
Python学习week2-python介绍与pyenv安装
查看>>
php判断网页是否gzip压缩
查看>>
一个有意思的js实例,你会吗??[原创]
查看>>
sql server中bit字段实现取反操作
查看>>
Part3_lesson2---ARM指令分类学习
查看>>
jQuery拖拽原理实例
查看>>
JavaScript 技巧与高级特性
查看>>
Uva 11729 Commando War
查看>>
增强学习(一) ----- 基本概念
查看>>
ubuntu下USB连接Android手机
查看>>
C# 语句 分支语句 switch----case----.
查看>>