您的位置:首页 > 编程语言 > Java开发

java排序之堆排序

2016-04-29 18:52 337 查看
这篇文章的代码叙述的是堆排序的构成,堆排序我认为最重要的就是理解,代码,真的简单的,这里我仅谈谈我的思路,将一个数组想想成一棵树,然后首先构建一个大根堆,然后将这个大根堆的根借点和最后一个交互位置,然后后面不断的重复交换,构建大根堆的过程,然后就完成排序了啊,其实,这个和我之前几篇说的差不多,这个堆排序是基于选择排序的,每次选出最大的一个,然后交换,这个方法最主要的就是将这些数据分开来选择,然后结合在一起了,而且每次构建堆也是一种排序,真的快。

代码:

package com.jk.heapsort;

/**
* 这个代码是堆排序的代码,我个人认为这个主要就是把这个代码想象成一个树,然后构造大根堆,然后不断和最后一个交换,就ok了,这个东西就需要自己去理解了。
*/
import java.util.Arrays;

public class Test {
public static void main(String[] args) {
int[] a = new int[] { 1, 9, 3, 6, 2, 8 };
heapSort(a, a.length);
System.out.println(Arrays.toString(a));
}

private static void heapSort(int[] a, int length) {
int i, j, h, k;
int t;
for (i = length / 2; i >= 0; i--) {// 将a[0,n-1]建成大根堆
while (2 * i + 1 < length) {// 第i个节点有右子树
j = 2 * i + 1;
if ((j + 1) < length) {
if (a[j] < a[j + 1])// 左子树小于右子树,那么应该比较右子树
j++;// 序号加1,指向右字数

}
if (a[i] < a[j]) {// 比较以i和j为序号的数据
t = a[i]; // 交换数据
a[i] = a[j];
a[j] = t;
i = j;
} else {
break;
}

}

}
// 这里其实就是进行每次的交换,然后重复建堆的过程
for (i = length - 1; i > 0; i--) {
t = a[0];
a[0] = a[i];
a[i] = t;
k = 0;
while (2 * k + 1 < i) {
j = 2 * k + 1;
if ((j + 1) < i) {
if (a[j] < a[j + 1]) {
j++;
}
}
if (a[k] < a[j]) {
t = a[k];
a[k] = a[j];
a[j] = t;
k = j;
} else {
break;
}
}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: