- 浏览: 263179 次
- 性别:
- 来自: 苏州
-
文章分类
- 全部博客 (289)
- java (72)
- oracle (3)
- mysql (5)
- spring (28)
- hibernate (2)
- osgi (0)
- linux (2)
- ExtJs (1)
- jvm (0)
- mybatis (7)
- 分布式 (11)
- MINA (6)
- apache+tomcat (13)
- js+htm (7)
- android (44)
- http (1)
- hbase+hdoop (0)
- memcache (13)
- search (27)
- 部署及性能 (12)
- mongoDB (2)
- 多线程 (12)
- 安全管理验证 (9)
- struts (1)
- webservice (0)
- easyUI (1)
- spring security (16)
- pattern (6)
- 算法 (2)
最新评论
-
lzh8189146:
CommonsHttpSolrServer这个类,现在是不是没 ...
CommonsHttpSolrServer -
xiaochanzi:
我按照你的方法试了下,tomcat6可以发布,但是访问任何网页 ...
基于内嵌Tomcat的应用开发 -
phoneeye:
麻烦你,如果是抄来的文章,请给出来源。谢谢
ant 两则技巧 -
neverforget:
转载不注明出处
Spring Security3.1登陆验证 替换 usernamepasswordfilter -
liang1022:
若不使用eclipse ,如何在命令行下 运行服务端程序 ?
WebService CXF学习(入门篇2):HelloWorld
堆排序(Heap Sort),java版.
版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.
原文出处:http://blog.chenlb.com/2008/12/heap-sort-for-java.html
堆排序是高效的排序方法。没有最坏情况(即与平均情况一样),空间占用又小,综合效率比快速排序还好。
堆排序原理:1、从数据集中构建大顶堆(或小顶堆)。2、堆顶与最后一个数据交换,然后维护堆顶使它还是大顶堆(或小顶堆)。3、重复2的过程,直到剩下一个数据。
时间复杂度:平均O(nlog2n),最坏情况O(nlog2n)。
示例代码:
- package com.chenlb.sort;
- import java.util.Arrays;
- /**
- * 堆排序.
- *
- * @author chenlb 2008-12-28 下午03:52:53
- */
- public class HeapSort {
- private static int parentIdx(int childIdx) {
- return (childIdx - 1) / 2; //索引从0开始, 注意childIdx=0时返回0
- }
- private static int leftChildIdx(int parentIdx) {
- return parentIdx*2 + 1;
- }
- /**
- * 构建大顶堆.
- * @author chenlb 2008-12-28 下午03:52:23
- */
- private static void buildMaxHeap(int[] datas) {
- int lastIdx = datas.length -1;
- for(int i=parentIdx(lastIdx); i>=0; i--) {
- int k = i;
- /*boolean isHeap = false;*/
- while(/*!isHeap && */leftChildIdx(k) <= lastIdx) {
- int j = leftChildIdx(k);
- if(j < lastIdx) { //有两个孩子
- if(datas[j] <= datas[j+1]) { //j+1 比较大, 选择大的
- j++;
- }
- }
- if(datas[k] > datas[j]) { //父的比较大
- /*isHeap = true;*/
- break;
- } else {
- SortUtil.swap(datas, k, j);
- k = j;
- }
- }
- }
- }
- /**
- * 堆顶改变, 要维护大顶堆.
- * @author chenlb 2008-12-28 下午03:53:04
- */
- private static void maintainMaxHeap(int[] datas, int lastIdx) {
- int k = 0;
- while(k <= parentIdx(lastIdx)) {
- int j = leftChildIdx(k);
- if(j < lastIdx) { //有两个孩子
- if(datas[j] <= datas[j+1]) { //j+1 比较大, 选择大的
- j++;
- }
- }
- if(datas[k] < datas[j]) { //父结点比较小
- SortUtil.swap(datas, k, j);
- k = j;
- } else {
- break;
- }
- }
- }
- public static int[] sort(int[] datas) {
- buildMaxHeap(datas);
- int lastIdx = datas.length - 1;
- while(lastIdx > 0) {
- SortUtil.swap(datas, 0, lastIdx);
- lastIdx--;
- if(lastIdx > 0) {
- maintainMaxHeap(datas, lastIdx);
- }
- }
- return datas;
- }
- public static void main(String[] args) {
- int[] datas = {5,1,3,4,9,2,7,6,5};//{2, 9, 3, 7, 8, 6, 4, 5, 0, 1};
- /*buildMaxHeap(datas);
- System.out.println(Arrays.toString(datas));*/
- sort(datas);
- System.out.println(Arrays.toString(datas));
- datas = SortUtil.randomDates(10);
- sort(datas);
- System.out.println(Arrays.toString(datas));
- }
- }
运行结果:
- [1, 2, 3, 4, 5, 5, 6, 7, 9]
- [18, 185, 239, 304, 407, 489, 546, 688, 744, 821]
待排序数据:5, 1, 3, 4, 9, 2, 7, 6, 5
构建大顶堆的过程:
5, 1, 3, 4, 9, 2, 7, 6, 5
5, 1, 3, 6, 9, 2, 7, 4, 5
5, 1, 7, 6, 9, 2, 3, 4, 5
5, 9, 7, 6, 1, 2, 3, 4, 5
9, 5, 7, 6, 1, 2, 3, 4, 5 -> 9, 6, 7, 5, 1, 2, 3, 4, 5
排序过程:
9, 6, 7, 5, 1, 2, 3, 4, 5
7, 6, 5, 5, 1, 2, 3, 4, 9
6, 5, 5, 4, 1, 2, 3, 7, 9
5, 5, 3, 4, 1, 2, 6, 7, 9
5, 4, 3, 2, 1, 5, 6, 7, 9
4, 2, 3, 1, 5, 5, 6, 7, 9
3, 2, 1, 4, 5, 5, 6, 7, 9
2, 1, 3, 4, 5, 5, 6, 7, 9
1, 2, 3, 4, 5, 5, 6, 7, 9
红色为交换。
发表评论
-
Java keytool 安全证书学习笔记
2012-08-02 14:16 806http://linliangyi2007.iteye.com ... -
java国际化
2012-07-16 14:08 424http://lavasoft.blog.51cto.com/ ... -
Java版远程控制V1.0
2012-06-17 21:37 775http://www.cnblogs.com/syxchina ... -
浅析Java中CountDownLatch用法
2012-05-16 20:57 805CountDownLatch如其所写,是一个 ... -
SMTP发送邮件
2012-04-18 09:41 780SMTP发送邮件 openkk 2011-06-0 ... -
smtp 返回代码 信息
2012-04-18 08:52 1458SMTP Server Response Cod ... -
JavaMail详解
2012-04-18 02:24 0JavaMail详解 博客分类: JAV ... -
安装Eclipse反编译插件
2012-04-17 09:34 810安装Eclipse反编译插件 博客分类: ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-04-13 08:30 671最近的机器内存又爆满了,除了新增机器内存外,还应该好好r ... -
Dijkstra算法
2012-04-11 08:00 877Dijkstra算法 博客分类: 算 ... -
java 播放音乐
2012-04-11 08:00 1008java 播放音乐 博客分类: J2 ... -
Java中的native,transient,volatile和strictfp关键字
2012-04-06 08:49 738Java中的native,transient,v ... -
用ReentrantLock模拟宴会的热闹情景
2012-04-05 08:32 913用ReentrantLock模拟宴会的热闹情景 ... -
Hashmap 分析
2012-04-05 08:32 738Hashmap 博客分类: 算法 ... -
ExecutorService线程池
2012-04-05 08:32 770ExecutorService线程池 (2010 ... -
Java并发:juc Executor框架详解
2012-04-05 08:32 793Java并发:juc Executor ... -
java并发包,多线程,工具类,笔记
2012-04-11 08:00 916JDK 线程池 Executors.newCachedT ... -
利用 Spring 和 EHCache 做方法缓存处理〔转〕
2012-04-09 09:49 860利用 Spring 和 EHCache 做方法缓存处理〔 ... -
EhCache使用详细介绍
2012-04-09 09:49 1356EhCache使用详细介绍 Ehcache中不仅可 ... -
HashMap 分析
2012-04-01 08:21 1912http://www.blogjava.net ...
相关推荐
1. 冒泡排序(Bubble Sort) ...6.堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort) 解压密码 douge
堆排序 堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法
1. 冒泡排序(Bubble Sort) def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): ...7. 堆排序(Heap Sort) 8. 计数排序(Counting Sort) 解压密码 douge
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的键值。在本文...
void heap_sort(int A[],int length) { BUILD_MAX_HEAP(A,length); int i,middle; for(i=length-1;i>0;i--) { middle=A[0]; A[0]=A[i]; A[i]=middle; heap_size--; MAX_HEAPIFY(A,0); } }
标题中的“test_heap_sort.rar_heap”表明这是一个关于堆排序(Heap Sort)的程序实现,使用了VC++(Visual C++)编程语言。堆排序是一种基于比较的排序算法,它的核心思想是利用二叉堆的数据结构来对数组进行排序。...
C++中实现堆排序,可以使用标准库中的`<algorithm>`头文件中的`make_heap`、`push_heap`、`pop_heap`和`sort_heap`等函数,但为了更直观地理解,我们可以自定义函数来实现整个过程。 以下是一个基本的C++代码示例:...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在C#中实现堆排序,我们可以分为两个主要步骤:建堆和调整堆。这里,我们将深入探讨堆排序的基本原理、C#实现的细节以及其在实际应用中的...
java十大排序算法实现 1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection ...6. 堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort)
堆排序算法的java实现,采用大根堆。时间复杂度为O(nlogn).
7. **堆排序(Heap Sort)** 堆排序使用堆这种数据结构,将待排序序列构造成一个大顶堆(或小顶堆),此时整个序列的最大值就是堆顶的根节点。然后将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素...
堆排序的核心思想是利用树形数据结构——堆(Heap)来完成排序。堆是一个近似完全二叉树的结构,同时满足大顶堆(父节点的值大于或等于其子节点的值)或小顶堆(父节点的值小于或等于其子节点的值)的性质。在堆排序...
以下是Java实现堆排序的基本步骤: 1. 构建大顶堆:从最后一个非叶子节点(即最后一个元素的父节点)开始,自底向上、自右向左进行调整,确保每个节点都大于或等于其子节点。 2. 交换堆顶元素与末尾元素:将最大...
堆排序(Heap Sort)是一种选择排序,利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。在排序时,先将待排序...
3. **堆排序(Heap Sort)**: 堆排序利用了二叉堆的特性,将待排序的序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整剩余元素成为新的堆,如此反复。Java中可以使用`PriorityQueue`类实现堆...
在本文中,我们将深入探讨堆排序的概念、工作原理,并分别以C语言和Java语言来实现这一算法。 堆排序的核心思想是利用二叉堆的特性进行排序。二叉堆分为大顶堆和小顶堆,大顶堆中每个节点的值都大于或等于其子节点...
最大堆排序(MaxHeap Sort)是一种基于比较的排序算法,它利用了数据结构中的最大堆特性来实现排序。最大堆是一种特殊的二叉堆,每个父节点的值都大于或等于其子节点的值,通常以数组的形式存储。下面将详细介绍最大...
在`堆排序Heap_sort.cpp`中,你可以学习到如何维护堆的性质并进行相应的调整,如 sift-up 和 sift-down 操作,以实现排序。 希尔排序,又称缩小增量排序,是插入排序的一种更高效的改进版本。它通过将待排序的元素...
堆排序(Heap Sort)利用堆这种数据结构所设计的一种排序算法,堆是一个近似完全二叉树的结构,并同时满足堆积的性质,即子节点的键值或索引总是小于(或者大于)它的父节点。通过将待排序的数组构造成一个大顶堆,...
压缩包内的文件名"heap_sort.py"可能包含堆排序算法的Python实现代码,而"readme.txt"可能包含关于该代码文件的说明和使用指南,或者是关于堆排序算法的详细介绍和应用案例。 堆排序算法是计算机科学中的一种经典...