美文网首页
堆和堆排序

堆和堆排序

作者: 知道吗123 | 来源:发表于2020-06-03 09:00 被阅读0次

最小K个数

class Solution {
    int[] heap;
    public int[] getLeastNumbers(int[] arr, int k) {
        if(k==0) return new int[0];
        heap = new int[k];
        for(int i = 0;i<k;i++)
            heap[i] = arr[i];
        //先进行堆有序。
        for(int i = (k-1)/2;i>=0;i--)
            sink(i,k);
        for(int i=k;i<arr.length;i++){
            if(arr[i]<heap[0]){
                heap[0] = arr[i];
                sink(0,k);
            }
        }
        return heap;
    }

    private void swim(int i){
        while(i>0 && heap[i]>heap[(i-1)/2])
            exch(i,(i-1)/2);
    }
    private void sink(int i, int N){
        while((2*i+1)<= N-1){
            int j = 2*i+1;
            if(j<N-1 && heap[j]<heap[j+1]) j++;
            if(heap[i]>heap[j]) break;
            exch(i,j);
            i=j;
        }
    }

    private void exch(int i,int j){
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }
}

堆排序

堆排序


// Java program for implementation of Heap Sort 
public class HeapSort 
{ 
    public void sort(int arr[]) 
    { 
        int n = arr.length; 
  
        // Build heap (rearrange array) 
        for (int i = n / 2 - 1; i >= 0; i--) 
            heapify(arr, n, i); 
  
        // One by one extract an element from heap 
        for (int i=n-1; i>0; i--) 
        { 
            // Move current root to end 
            int temp = arr[0]; 
            arr[0] = arr[i]; 
            arr[i] = temp; 
  
            // call max heapify on the reduced heap 
            heapify(arr, i, 0); 
        } 
    } 
  
    // To heapify a subtree rooted with node i which is 
    // an index in arr[]. n is size of heap 
    void heapify(int arr[], int n, int i) 
    { 
        int largest = i; // Initialize largest as root 
        int l = 2*i + 1; // left = 2*i + 1 
        int r = 2*i + 2; // right = 2*i + 2 
  
        // If left child is larger than root 
        if (l < n && arr[l] > arr[largest]) 
            largest = l; 
  
        // If right child is larger than largest so far 
        if (r < n && arr[r] > arr[largest]) 
            largest = r; 
  
        // If largest is not root 
        if (largest != i) 
        { 
            int swap = arr[i]; 
            arr[i] = arr[largest]; 
            arr[largest] = swap; 
  
            // Recursively heapify the affected sub-tree 
            heapify(arr, n, largest); 
        } 
    } 
  
    /* A utility function to print array of size n */
    static void printArray(int arr[]) 
    { 
        int n = arr.length; 
        for (int i=0; i<n; ++i) 
            System.out.print(arr[i]+" "); 
        System.out.println(); 
    } 
  
    // Driver program 
    public static void main(String args[]) 
    { 
        int arr[] = {12, 11, 13, 5, 6, 7}; 
        int n = arr.length; 
  
        HeapSort ob = new HeapSort(); 
        ob.sort(arr); 
  
        System.out.println("Sorted array is"); 
        printArray(arr); 
    } 
} 

相关文章

  • 堆 - 堆和堆排序

    什么是堆 堆是一种特殊的树,它有两个特点: 堆是一个完全二叉树 堆中每个节点的值都必须大于等于(或小于等于)其子树...

  • 堆和堆排序

    堆的简介 堆排序是一种复杂度为Nlog(N)的排序算法。介绍堆排序之前先讲一讲什么是堆。这里介绍的是数据结构中的二...

  • 堆和堆排序

    堆: 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于左右孩子节点的值,称为大顶堆;每个节点的值都小于或等于...

  • 堆和堆排序

    姓名:王怀帅 学号:16040410035 转载自:http://www.jianshu.com/p/86428c...

  • 堆和堆排序

    优先队列 优先队列是什么:与常见的队列不同的是,优先队列并不遵循“先进先出”的原则,反而是根据优先级来确定是否先出...

  • 堆和堆排序

    1. 堆的概念 堆是一种特殊的树,一个堆需要满足如下两个条件: 一个堆是一个完全二叉树; 堆中每个节点的值都必须大...

  • 堆和堆排序

    堆: 1,堆是一个完全二叉树;完全二叉树要求除了最后一层,其他层的节点都是满的,最后一层的节点都靠左排列。2,堆中...

  • 堆和堆排序

    一、堆的定义 (1)堆树是一颗完全二叉树; (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值; (3)堆树...

  • 堆和堆排序

    什么是堆? 如何存储一个堆(如何实现一个堆?) 堆的插入、删除操作 如何基于堆实现排序?(建堆和排序) 为什么快速...

  • 堆和堆排序

    1. 堆的基础知识 1.1 什么是堆 堆是一种特殊的二叉树,它需要满足如下两个条件 堆是一颗完全二叉树 堆中每个节...

网友评论

      本文标题:堆和堆排序

      本文链接:https://www.haomeiwen.com/subject/juqvzhtx.html