数据结构和算法 堆排序

原理:

堆排序(英语:Heapsort)是指利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。

重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的维持最大堆性质。

图解:

 

 

代码实现:

代码git地址

https://github.com/baochunhai/data-structure-algorithms.git

手写堆:

 /**
 * 手写大根堆
 * 特殊逻辑关系:
 * 1.寻找父节点(i-1)/2
 * 2.寻找左孩子2*i+1,寻找右孩子2*i+2
 * @author Administrator
 */
public class Heap {
    // 堆的大小
    private  int heapSize;
    // 模拟堆
    private  int[] heap;

    public int[] getHeap() {
        return heap;
    }

    // 数组大小
    private  int limit;

    public Heap(int limit) {
        heap = new int[limit];
        this.limit = limit;
        heapSize = 0;
    }


    public  boolean isEmpty(){
        return heapSize==0;
    }
    public  boolean isFull(){
        return heapSize==limit;
    }
    public int size(){
        return limit;
    }

    /**
     * 根据用户给的值,
     * @param value
     */
    public void push(int value){
        if (heapSize==limit){
            throw new RuntimeException("堆已经满了");
        }
        heap[heapSize] = value;
        heapInsert(heap,heapSize);
        heapSize++;
    }
    public int pop(){
        int ans = heap[0];
        SortUtil.swap(heap,0,--heapSize);
        heapify(heap, 0, heapSize);
        return ans;
    }
    /**
     * 依次向堆中添加元素,如果大于父,就和父交换
     * 使堆成为一个大根堆
     * @param arr
     * @param index
     */
    public void heapInsert(int[] arr,int index){
       while (arr[index]>arr[(index-1)/2]){
           SortUtil.swap(arr,index,(index-1)/2);
           index = (index-1)/2;
       }

    }

    /**
     * 当前arr[0]位置是前大根堆的arr.length-1位置,为了保证heap还是大根堆,
     * arr[0]的值需要不断下沉,直到他的孩子中没有比他大的
     * @param arr
     * @param index
     * @param size
     */
    public void heapify(int[] arr, int index, int size){
        // 左孩子
        int left = index * 2 + 1;
        while (left<heapSize){
            // 如果右孩子存在,找到左右2个孩子中较大的那个
            int largest = left+1<heapSize&&arr[left]<arr[left+1]?left+1:left;
            // 比较是否比2个孩子中较大的还要大
            largest = arr[largest]<arr[index]?index:largest;
            if(largest==index){break;}
            // 交换
            SortUtil.swap(arr,index,largest);
            index = largest;
            left = index * 2 + 1;
        }
    }

}

堆排序1.0:

 /**
 * 堆排序
 * @author Administrator
 */
public class HeapSort {
    public static void main(String[] args) {
        int[] arr = SortUtil.randomArr(10);
        SortUtil.printArr(arr);
        heapSort(arr);
//        SortUtil.printArr(arr);

    }
    public static void heapSort(int[] arr){
        Heap heap = new Heap(arr.length);
        for (int i = 0; i < heap.size(); i++) {
            heap.push(arr[i]);
        }
        System.out.println("push");
        SortUtil.printArr(heap.getHeap());
        for (int i = 0; i < heap.size(); i++) {
            heap.pop();
        }
        System.out.println("pop");
        SortUtil.printArr(heap.getHeap());
    }
}

堆排序2.0待添加。。。

时间复杂度分析:

 

稳定性:

       不稳定。

 

1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法的实现机制,开阔编程思路,提高优化程序的能力。
做一门精致,全面详细的 java数据结构算法!!! 让天下没有难学的数据结构, 让天下没有难学的算法, 不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发??? 总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱 话不多说,牛不多吹,我们要讲的本门课程内容: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页