Java-堆排序
public class Main {
public static void main(String[] args) {
int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, 2, 3, 6, 4};
a = heapSort(a);
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
//构建大根堆
private static int[] buildMaxHeap(int[] a) {
//从最后一个节点a.length-1的父节点(array.length-1-1)/2开始,直到根节点0,反复调整堆
int half = (a.length - 2) / 2;
for (int i = half; i >= 0; i--) {
adjustDownToUp(a, i, a.length);
}
return a;
}
//将元素array[k]自下往上逐步调整树形结构
private static void adjustDownToUp(int[] a, int k, int length) {
int temp = a[k];
for (int i = 2 * k + 1; i < length - 1; i = 2 * i + 1) { //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整
if (i < length && a[i] < a[i + 1]) { //取节点较大的子节点的下标
i++; //如果节点的右孩子>左孩子,则取右孩子节点的下标
}
if (temp >= a[i]) { //根节点 >=左右子女中关键字较大者,调整结束
break;
} else { //根节点 <左右子女中关键字较大者
a[k] = a[i]; //将左右子结点中较大值array[i]调整到双亲节点上
k = i; //修改k值,以便继续向下调整
}
}
a[k] = temp; //被调整的结点的值放入最终位置
}
//堆排序
public static int[] heapSort(int[] array) {
array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素
for (int i = array.length - 1; i > 1; i--) {
swap(array, 0, i);//将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置
adjustDownToUp(array, 0, i); //整理,将剩余的元素整理成堆
}
return array;
}
//交换
public static void swap(int a[], int i, int j) {
a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];
}
}
直接上代码,从代码中细细品味,分析。
思路:1、构建大堆或小堆 2、交换、调整
Java-堆排序的更多相关文章
- java堆排序实现
代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println(&quo ...
- java 堆排序的实现
堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点.而两个字节点大小不一定. 堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法. 堆排序也 ...
- java堆排序(大根堆)
实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之.创建好大根堆以后, ...
- 9 Java 堆排序
堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻 ...
- java堆排序
直接贴源代码: package com.java.fmd; import java.util.Scanner; public class HeapSort { int[] arr; public st ...
- Hark的数据结构与算法练习之堆排序
前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
详细过程就不表了,看代码吧 import java.util.Arrays; public class Sort { static int swapTimes=0; public static voi ...
- java基础之:堆排序
最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...
随机推荐
- ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解
ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...
- 01_6_Struts_ActionWildcard_通配符配置
01_6_Struts_ActionWildcard_通配符配置 1.Struts_ActionWildcard_通配符配置 1.1配置struts.xml文件 <package name=&q ...
- 【转】matlab练习程序(奇异值分解压缩图像)
介绍一下奇异值分解来压缩图像.今年的上半年中的一篇博客贴了一篇用奇异值分解处理pca问题的程序,当时用的是图像序列,是把图像序列中的不同部分分离开来.这里是用的不是图像序列了,只是单单的一幅图像,所以 ...
- OverflowError:django signed integer is greater than maximum
在学习一对一查询的时候,打印作者的电话时报了这个错 alex = Author.objects.filter(name='alex').first() print(alex.authordetail. ...
- sqli-labs less1 &&less3&&less4学习心得
0x01.less1 id=1/ id=1 and 1=1结果正常 id=1 and 1=2结果正常,不合理 id=1'提示:
- Linux下open函数、read函数、write函数记录
open() #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int open( cons ...
- Mysql中的联合索引、前缀索引、覆盖索引
索引 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 联合索引 又名复合索引,由两个或多个列的索引.它规定了mys ...
- luogu2754 星际转移问题
源向地球连 月球向汇连 每一天往下一天连 飞船上一天与这一天连 枚举答案 #include <iostream> #include <cstring> #include < ...
- Eclipse下创建Spring MVC web程序--maven版
1. 创建一个maven工程: File->New->Other... 2. 创建完成后的结构如下: 3. 配置pom.xml文件,添加spring-webmvc依赖项 <pro ...
- WordCount 2.0(结对项目)
序言 合作伙伴 201631062220 201631062120 项目码云地址: https://gitee.com/zhege/WordCount 作业详细要求 系统分析与设计结对项目 ...