Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1135857
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-05-06 23:27:04

一开始接触堆排序的时候,真的是恨死它了。。这么简单的几句代码,让我痛不欲生,真实验证了那句话,越简洁的代码越能让人抓狂。
  好了,下面让我们来谈一下堆排序。
   n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):                 ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子原理就是这么简单,其实堆满足很多性质,值得一体的是,java中的对象就是存在堆中的,堆在java中是可动态分配内存的,而栈则不行。所以,学习堆对java的学习也是有帮助的。好的,下面说一下怎么生成堆:
① 初始化操作:将R[1..n]构造为初始堆;  ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
其实,千言万语道不尽,一切尽在代码中,贴一下我写的代码。

点击(此处)折叠或打开

  1. public class HeapSort {
  2.     //参数分别代表排序的数组,起始位置,长度
  3.     static void HeapAjust(int[] num,int s,int length){
  4.         

  5.         int rc = num[s];
  6.         for(int i=2*s;i<=length;i*=2){
  7.             if((i<length)&&(num[i])<num[i+1]) //比较兄弟节点的大小
  8.                 i++;
  9.             if(num[i]>rc){ //如果子节点比父节点大,则将字节点的值赋值给父节点,保留父节点的位置
  10.                 num[s]=num[i];s=i;
  11.             }
  12.         }
  13.         num[s] = rc; //将父节点给了保留的位置
  14.     }
  15.     

  16.     /**
  17.      * @param args
  18.      */
  19.     public static void main(String[] args) {
  20.         // TODO Auto-generated method stub
  21.                 int[] num={0,1,3,2,4,7,5,6,45}; // 第一个元素不参与排序
  22.                 int length = num.length -1; //元素的长度
  23.             //大顶堆
  24.             for(int i=length/2;i>0;i--){
  25.                 HeapAjust(num,i,length); //从最后的一个节点开始从下向上调整,最后的堆顶的元素是最大的
  26.             }
  27.             for(int i=length;i>0;i--){
  28.                 System.out.println(num[1]); //把最大的一个拿出来
  29.                 num[1] = num[i]; //最后一个元素给第一个元素
  30.                 HeapAjust(num,1,i-1); //从新调整大顶堆
  31.             }
  32.             
  33.                 
  34.     }

  35. }




     
阅读(811) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

Bean_lee2012-09-26 13:00:06

☆彼岸★花开: 在快速排序, 堆排序,归并排序中 哪个是最稳定的排序方法?.....
标准的快排 不稳定,与输入有关。 退化的情况下,相当的慢
归并排序,需要额外的空间,
堆排序 从概率学的角度分析,比较和交换太多。

我推崇随机化快速排序 ,快,原地,并且稳定。

thomaslwq2012-05-08 21:00:51

☆彼岸★花开: 在快速排序, 堆排序,归并排序中 哪个是最稳定的排序方法?.....
快排最不稳定,最坏是0(n2)的。归并时间复杂度是nlogn,但是需要每次都开辟新的数组空间存储递归过程中的数据,故很少用,但确是快排的理论基础来的。堆排序时间复杂度也是nlogn,但是实际上,有针对随机文件的计时试验指出,堆排序比快排慢,但是和合并排序还是差不多的。。

☆彼岸★花开2012-05-08 19:28:09

在快速排序, 堆排序,归并排序中 哪个是最稳定的排序方法?