一开始接触堆排序的时候,真的是恨死它了。。这么简单的几句代码,让我痛不欲生,真实验证了那句话,越简洁的代码越能让人抓狂。 好了,下面让我们来谈一下堆排序。 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]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。 其实,千言万语道不尽,一切尽在代码中,贴一下我写的代码。