zoukankan      html  css  js  c++  java
  • Heap Sort

    Heap Sort 

    1. Build a max heap using exsiting array, which is called Heapify
    2. Swap root with the last element, and re-Heapify the root node

    Heapify

    Heapify(array, n, i) = 1) compare node[i] with children   2)node[i] is already the largest one, no op.  3) child is largest one, swap, then Heapify(array, n, 2*i + 1 or 2i* + 2)

    Code

        public class HeapSort
        {
            /// <summary>
            /// Heapify the array
            /// </summary>
            /// <param name="array">array</param>
            /// <param name="n">total size of the heap</param>
            /// <param name="i">starting node</param>
            public void Heapify(int[] array, int n, int i)
            {
                int left = 2*i + 1;
                int right = 2*i + 2;
    
                int largest = i;
    
                if (left < n)
                {
                    if (array[left] > array[largest])  //  <---- 此处注意,要用array[largest] instead of array[i], 这样我们可以一直跟踪最大的下标, 而不会错误的交换次大的下标
                    {
                        largest = left;
                    }
                }
    
                if (right < n)
                {
                    if (array[right] > array[largest])
                    {
                        largest = right;
                    }
                }
    
                if (largest != i)
                {
                    int temp = array[i];
                    array[i] = array[largest];
                    array[largest] = temp;
                    Heapify(array, n, largest);
                }
            }
    
            public void BuildHeap(int[] array)
            {
                for(int i = array.Length / 2 - 1; i >= 0; i--)
                {
                    Heapify(array, array.Length, i);
                }
            }
    
            public void Sort(int[] array)
            {
                if (array == null || array.Length == 0)
                {
                    return;
                }
    
                BuildHeap(array);
    
                for(int i = array.Length - 1; i >= 0; i--)
                {
                    Swap(ref array[0], ref array[i]);
                    Heapify(array, i, 0);
                }
            }
    
            public void Print(int[] array)
            {
                for(int i = 0; i < array.Length; i++)
                {
                    Console.WriteLine(array[i]);
                }
            }
    
            private void Swap(ref int a, ref int b)
            {
                int temp = a;
                a = b;
                b = temp;
            }
        }

    Comments

    1. Heap sort is a in place sort.
    2. Time complexity is O(NLogN) for Heapify.A quick look over the above algorithm suggests that the running time is O(nlg(n)), since each call to Heapify costs O(lg(n)) and Build-Heap makes O(n) such calls.
  • 相关阅读:
    jenkins自动化部署前端项目
    jenkins自动部署java项目
    Jenkins插件修改为国内源
    jenkins搭建以及初始化
    gitlab-ci集成sonarqube完成代码检测
    微信小程序模板消息后端代码
    解决上传图片到服务器 水印文字显示框框不显示文字的问题
    ES transport client使用
    签发的用户认证token超时刷新策略
    api权限管理系统与前后端分离实践
  • 原文地址:https://www.cnblogs.com/xuyanran/p/8415918.html
Copyright © 2011-2022 走看看