- 浏览: 257997 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (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 793http://linliangyi2007.iteye.com ... -
java国际化
2012-07-16 14:08 407http://lavasoft.blog.51cto.com/ ... -
Java版远程控制V1.0
2012-06-17 21:37 746http://www.cnblogs.com/syxchina ... -
浅析Java中CountDownLatch用法
2012-05-16 20:57 791CountDownLatch如其所写,是一个 ... -
SMTP发送邮件
2012-04-18 09:41 753SMTP发送邮件 openkk 2011-06-0 ... -
smtp 返回代码 信息
2012-04-18 08:52 1440SMTP Server Response Cod ... -
JavaMail详解
2012-04-18 02:24 0JavaMail详解 博客分类: JAV ... -
安装Eclipse反编译插件
2012-04-17 09:34 797安装Eclipse反编译插件 博客分类: ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-04-13 08:30 658最近的机器内存又爆满了,除了新增机器内存外,还应该好好r ... -
Dijkstra算法
2012-04-11 08:00 859Dijkstra算法 博客分类: 算 ... -
java 播放音乐
2012-04-11 08:00 992java 播放音乐 博客分类: J2 ... -
Java中的native,transient,volatile和strictfp关键字
2012-04-06 08:49 725Java中的native,transient,v ... -
用ReentrantLock模拟宴会的热闹情景
2012-04-05 08:32 898用ReentrantLock模拟宴会的热闹情景 ... -
Hashmap 分析
2012-04-05 08:32 724Hashmap 博客分类: 算法 ... -
ExecutorService线程池
2012-04-05 08:32 752ExecutorService线程池 (2010 ... -
Java并发:juc Executor框架详解
2012-04-05 08:32 773Java并发:juc Executor ... -
java并发包,多线程,工具类,笔记
2012-04-11 08:00 891JDK 线程池 Executors.newCachedT ... -
利用 Spring 和 EHCache 做方法缓存处理〔转〕
2012-04-09 09:49 831利用 Spring 和 EHCache 做方法缓存处理〔 ... -
EhCache使用详细介绍
2012-04-09 09:49 1344EhCache使用详细介绍 Ehcache中不仅可 ... -
HashMap 分析
2012-04-01 08:21 1893http://www.blogjava.net ...
相关推荐
1. 冒泡排序(Bubble Sort) ...6.堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort) 解压密码 douge
堆排序 1.选择排序 Selection Sort 2.冒泡排序 Bubble Sort 3.插入排序 Insertion Sort 4.归并排序 Merge Sort 5.快速排序 Quick Sort 6.堆排序 Heap Sort 7.总结 summary
堆排序 堆排序(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. 交换堆顶元素与末尾元素:将最大...
3. **堆排序(Heap Sort)**: 堆排序利用了二叉堆的特性,将待排序的序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整剩余元素成为新的堆,如此反复。Java中可以使用`PriorityQueue`类实现堆...
在本文中,我们将深入探讨堆排序的概念、工作原理,并分别以C语言和Java语言来实现这一算法。 堆排序的核心思想是利用二叉堆的特性进行排序。二叉堆分为大顶堆和小顶堆,大顶堆中每个节点的值都大于或等于其子节点...
最大堆排序(MaxHeap Sort)是一种基于比较的排序算法,它利用了数据结构中的最大堆特性来实现排序。最大堆是一种特殊的二叉堆,每个父节点的值都大于或等于其子节点的值,通常以数组的形式存储。下面将详细介绍最大...
在`堆排序Heap_sort.cpp`中,你可以学习到如何维护堆的性质并进行相应的调整,如 sift-up 和 sift-down 操作,以实现排序。 希尔排序,又称缩小增量排序,是插入排序的一种更高效的改进版本。它通过将待排序的元素...
本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)这三种经典的排序算法,并探讨它们的原理、优缺点以及在实际应用中的选择。 **快速排序(Quick Sort)**...
用C++实现的 堆排序,包括恢复堆,构建初始堆