Java版堆排序[不稳定]

发布于 2020-04-15 15:46:46
关注者
0
被浏览
765
1 个回答
  • 面试哥
    面试哥 2020-04-15
    为面试而生,有面试问题,就找面试哥。

    堆一般指二叉堆。

    复杂度:O(nlogn) - O(nlgn) - O(nlgn) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]

    大顶堆实现从小到大的升序排列,小顶堆一般用于构造优先队列

    	public void heapSort(int[] a) {
    		if (null == a || a.length < 2) {
    			return;
    		}
    		
    		buildMaxHeap(a);
    		
    		for (int i = a.length - 1; i >= 0; i--) {
    			int temp = a[0];
    			a[0] = a[i];
    			a[i] = temp;
    			
    			adjustHeap(a, i, 0);
    		}
    	}
    
    	// 建堆
    	private void buildMaxHeap(int[] a) {
    		int mid = a.length / 2;
    		for (int i = mid; i >= 0; i--) {
    			adjustHeap(a, a.length, i);
    		}
    	}
    	
    	// 递归调整堆
    	private void adjustHeap(int[] a, int size, int parent) {
    		int left = 2 * parent + 1;
    		int right = 2 * parent + 2;
    		
    		int largest = parent;
    		if (left < size && a[left] > a[parent]) {
    			largest = left;
    		}
    		
    		if (right < size && a[right] > a[largest]) {
    			largest = right;
    		}
    		
    		if (parent != largest) {
    			int temp = a[parent];
    			a[parent] = a[largest];
    			a[largest] = temp;
    			adjustHeap(a, size, largest);
    		}
    	}
    
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看