堆排序(java 版本 )


//第一位不参加排序
public class DuiPaiXu {
	public static int[] a = { 0, 23, 5, 12, 5, 76, 24, 31, 4, 89, 44, 54 };

	public static void paixu(int i, int total) {
		int temp = a[i];
		for (int j = i * 2; j <= total; j *= 2) {
			if (j < total) {
				if (a[j] > a[j + 1]) {
					j++;
				}
			}
			if (temp <= a[j]) { //如果比子节点都小 直接结束这次调整
				break;
			}
			a[i] = a[j];//找出父节点,2个子节点中最小的 先调整位置
			i = j;     //记录最小的位置,另外一个分支不用考虑,因为另外一个分支没有变动,所以不
		}
		a[i] = temp;//给想要调整的节点一个合适位置
	}

	public static void main(String[] args) {
		// 构造初始堆
		for (int i = (a.length - 1) / 2; i > 0; i--) {
			paixu(i, a.length - 1); //初始从非叶子调,叶子没有子节点,所以调整无意义
      //从1 到 length/2 应该都是非叶子节点. 每次都需要全局调整 所以total = length-1
		}
		// 堆排序
		for (int i = a.length - 1; i > 0; i--) {
			int temp = a[i]; // 直接取出第一个 为最小
			a[i] = a[1];
			a[1] = temp;
			// 交换完之后 需要i-1 总数减少
			paixu(1, i - 1);
			// 从大往小输入 空间重复利用,最后一个为最小倒排
			System.out.println(a[i]);
		}

	}

}

 

你可能感兴趣的:(JAVA编程)