美文网首页
堆排序java实现

堆排序java实现

作者: 雨落千木的时节 | 来源:发表于2018-10-23 16:41 被阅读0次

//堆排序:
//基本思想:
//首先要了解堆这种数据结构:
//堆是实质上是一个满足如下条件的完全二叉树:树中任意非叶节点的关键字均不大于(或不小于)其左右孩子节点的关键字,即:
//给定关键字数列:T1,T2,...,Tn,
//当且仅当数列满足如下性质:(1)Ti<=T2i且Ti<=T2i+1或者(2)Ti>=T2i且Ti>=T2i+1(1<=i<=n/2取最小值)
//堆分为大根堆和小根堆:
//大根堆是指根节点的关键字是所有堆节店关键字中的最大者(升序)
//小根堆是指:根节点的关键字是所有节点关键字的最小者(降序)
//堆排序顾名思义就是基于堆这种数据结构进行排序,在排序过程中,将数列看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中
//双亲节点和孩子节点之间的关系,在当前无序区中选择关键字最大或最小的记录。
//利用小根堆排序的步骤:
//1.构造一个大根堆
//2.将当前无序的堆顶记录T1和该区间的最后一个记录交换,然后将新的无序区调整为堆(称为重建堆)
//3.重复上述操作


image

//平均时间复杂度:O(nlogn)
//由于每次重新恢复堆的时间复杂度为O(logn),共n-1次重新恢复堆的操作,
//再加上前面简历堆时n/2次向下调整,每次调整的时间复杂度也为O(logn),两次操作时间相加还是O(nlogn)

public class HeapSort {
public static void main(String[] args) {

int[] arr = new int[]{6,2,4,1,9,3,6,7,0};

System.out.println("排序前=====");

print(arr);

System.out.println("");

System.out.println("排序后");

heapSort(arr,arr.length);

print(arr);

}

public static void heapSort(int[] arr,int n) {

int temp = 0;

MakeMinHeap(arr, n);

for(int i=n-1; i>0; i--){

temp = arr[0];

arr[0] = arr[i];

arr[i] = temp;

MinHeapFixDown(arr, 0, i);

}

}

//构建最小堆

public static void MakeMinHeap(int[] arr,int n){

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

MinHeapFixDown(arr,i,n);

}

}

//从节点i开始调整,n为节点总数,从0开始

public static void MinHeapFixDown(int[] arr,int i,int n){

int j = 2*i+1;//子节点

int temp = 0;

while(j<n){//在左右子节点中寻找最小的

if(j+1<n && arr[j+1]<arr[j]){

j++;

}

if(arr[i] <= arr[j])

break;

//较大节点下移

temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

i = j;

j = 2*i+1;

}

}

public static void print(int[] arr){

for(int i=0; i<arr.length; i++){

System.out.print(arr[i]+",");

}

}

}

相关文章

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 堆排序(非递归版)

    时间复杂度是O(nlogN) 但是不常用堆排序,因为堆排序不稳定 Java实现

  • 堆排序java实现

    //堆排序://基本思想://首先要了解堆这种数据结构://堆是实质上是一个满足如下条件的完全二叉树:树中任意非叶...

  • Java 实现 堆排序

    关键点 : 平衡二叉树; 任意父节点都大于(小于)子节点; 用数组来储存。(父节点为arr[i],则左节点arr[...

  • 堆排序(java实现)

    一、前言 堆是一个数组,它可以看成近似的完全二叉树。表示堆的数组包括两个属性:A.length数组元素的个数,A....

  • 堆排序(Java实现)

    封装成类: 测试: 输出:[-1, 9, 0, 6, 5, 8, 2, 1, 7, 4, 3][-1, 0, 1,...

  • 堆排序算法(Java实现)

    原始堆如下: 堆排序算法 构造初始堆,从最后一个非叶节点开始调整选出叶子节点中比自己大的一个交换,如果交换后的叶子...

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

网友评论

      本文标题:堆排序java实现

      本文链接:https://www.haomeiwen.com/subject/hyuazftx.html