java排序之堆排序

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

代码:

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;
				}
			}

		}

	}

}


你可能感兴趣的:(Java排序)