數據結構與算法(JAVA版)4_3:與堆有關的題目

題目:已知一個幾乎有序的數組,幾乎有序是指,如果把數組排好順序的話,每個元素移動的距離一定不超過k,並且k相對於數組長度來說比較小,請選擇一個合適的排序策略,對這個數組進行排序

package com.inspire.chapter4;

import java.util.PriorityQueue;

public class SortArrayDistanceLessK {

	public static void main(String[] args) {
		int[] arr = { 5, 4, 3, 2, 1, 6, 7, 10, 9, 8 };
		int k = 5;
		sortedArrDistanceLessK(arr, k);
		printf(arr);
	}

	private static void sortedArrDistanceLessK(int[] arr, int k) {
		PriorityQueue<Integer> heap = new PriorityQueue<>();
		// 將數組中前k個元素放進堆中
		int index = 0;
		for (; index < Math.min(arr.length - 1, k); index++) {
			heap.add(arr[index]);
		} // 前k個元素的堆結構已經調整好了
		int i = 0;
		for (; index < arr.length; index++, i++) {
			arr[i] = heap.poll();// 彈出堆頂,放進數組第i個位置
			heap.add(arr[index]);// 將第index個元素放進堆中
		}
		while (!heap.isEmpty()) {
			arr[i++] = heap.poll();
		}
	}

	private static void printf(int[] arr) {
		for (int i : arr) {
			System.out.print(i + " ");
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章