java 堆排序的实现
堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点。而两个字节点大小不一定。
堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法。
堆排序也可以用于找最大的k个数。时间复杂度为klog(n),因为建堆后,每次循环实际上都生成一个最大数。
下面见代码:
//从小到大排序
public class HeapSort {
private int[] A;
private int heapSize;
//构造函数,传入待排序数组
public HeapSort(int[] A){
this.A = A;
}
public int[] getSortedArray(){
return A;
} //从节点i出发,使得父节点的数不小于子节点的数
private void heapify(int i) {
//加1、加2后才是该节点的两个子节点
int left = 2*i + 1;
int right = 2*i + 2;
int largest = 0; //取得该节点、两个子节点中最大的编号
if (left < heapSize && A[left] > A[i]) {
largest = left;
}else {
largest = i;
} if (right < heapSize && A[right] > A[largest]) {
largest = right;
}
//若最大编号不是它,则继续建堆,否则就满足堆要求
if (largest != i) {
int temp = A[i];
A[i] = A[largest];
A[largest] = temp;
heapify(largest);
}
} private void buildHeap(){
heapSize = A.length;
for (int i = (heapSize/2 - 1); i >= 0; i--) {
heapify(i);
}
} private void heapSort(){
buildHeap();
int temp;
for (int i = A.length-1; i > 0; i--) {
temp = A[i];
A[i] = A[0];
A[0] = temp;
heapSize--;
heapify(0);
}
} public static void main(String[] args) {
//测试用例
int[] array = {16,4,10,14,7,9,3,2,8,1,5,3,6,100};
HeapSort heapSort = new HeapSort(array);
heapSort.heapSort();
for (int i : heapSort.A) {
System.out.println(i);
}
}
}
java 堆排序的实现的更多相关文章
- java堆排序实现
代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println(&quo ...
- 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基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...
随机推荐
- Java Http接收中文乱码解决
当时url传递时,可用 byte[] bytes=reqdata_s.getBytes("ISO-8859-1"); String name=new String(bytes,&q ...
- pycharm 创建文件时,自动添加文件头注释
File->settings->Editor->File and Code Templates->Python Script # -*- coding: utf-8 -*- & ...
- UI设计教程学习分享:APP布局
一.宫格布局 这种APP信息布局方式也是我们目前最常见的一种方式,也是符合用户习惯和黄金比例的设计方式,最知名的就是锤子手机的界面设计.锤子手机界面设计欣赏知名的APP设计采用的九宫格.六宫格等方式布 ...
- 爬虫初窥day3:BeautifulSoup
信息提取 1.通过Tag对象的属性和方法 #!/usr/bin/python # -*- coding: utf- -*- from urllib.request import urlopen fro ...
- gunicorn配置文件
最近使用gunicorn部署,感觉用命令参数方式启动比较繁琐,而且有时候就忘了以前怎么设置的了.一笑... 上stackoverflow查了查,找到了一个官方示例,在这里. 官方解释在这里. 记在这里 ...
- Scrapy框架爬虫
一.sprapy爬虫框架 pip install pypiwin32 1) 创建爬虫框架 scrapy startproject Project # 创建爬虫项目 You can start your ...
- 2019.01.20 bzoj2238: Mst(kruskal+树链剖分)
传送门 树链剖分菜题. 题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树. 思路: 先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链 ...
- javascript捕获页面窗口关闭事件
javascript捕获窗口关闭事件有两种方法 onbeforeunload() ,onUnload() 用法有两种: 1. function window.onbefore ...
- 一个WCF 数据序列化问题
public class EMMPBaseMsg { public String Data { get; set; } public DateTime AddTime { get; set; } pu ...
- java常用设计模式六:适配器模式
一.定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.比如以下的场景: 用手机充电为例,有一个手机的插孔是TypeC口,现在只 ...