堆排序

堆排序

public static void heapSort(int[] arr) {
		//构建最大堆
		heapInsert(arr);
		int size = arr.length;
		while (size > 1) {
			//调整堆顶和堆底的数值
			swap(arr, 0, size - 1);
			size--;
			//构造最大堆
			heapify(arr, 0, size);
		}
	}

	private static void heapify(int[] arr, int beigin, int end) {
		int[] arr1 = Arrays.copyOfRange(arr, beigin, end);
		heapInsert(arr1);
		int j = 0;
		for(int i = beigin; i < end; i++){
			arr[i] = arr1[j];
			j++;
		}
	}

	private static void swap(int[] arr, int a, int b) {
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

	private static void heapInsert(int[] arr) {
		int end = arr.length - 1;
		while (end > 0){
			int father = (end - 1) / 2;
			if(arr[father] < arr[end]){
				swap(arr, end, father);
			}
			end--;
		}
	}

	public static void main(String[] args){
		int[] arr = {3, 6, 8, 5, 7,10,11,21,23,55,23,66,1,534};
		heapSort(arr);
		System.out.println(arr);
	}

  

1、构建最大堆

2、从数组的队尾往前,先将第一个和最后一个交换位置

3、重新构建最大堆

4、依次类推。。。

---------------------

参考文章:

https://blog.csdn.net/u010452388/article/details/81283998 (这篇文章相当清晰)

原文地址:https://www.cnblogs.com/zhangchiblog/p/11904817.html