堆排序(Heapsort)

   class Program
    {
        static void Main(string[] args)
        {

            int[] arr = { 4, 10, 3, 5, 1, 2,16};
            int size = arr.Length;
            Heapsort(arr, size);
            foreach (int item in arr)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
              
        }

        public static void swap(int[] arr, int i, int j)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        public static void Heapsort(int[] tree, int n)
        {
            build_heap(tree, n);
            int i;
            for (i = n - 1; i >= 0; i--)
            {
                swap(tree, i, 0);
                heapify(tree, i, 0);
            }
        }
        public static void build_heap(int[] tree, int n)
        {
            int last_node = n - 1;
            int parent = (last_node - 1)/2;
            int i;
            for (i = parent; i >= 0; i--)
            {
                heapify(tree, n, i);
            }
        }
        public static void heapify(int[] tree,int n,int i)        
        {
            if (i >= n) {
                return;
            }
            int c1 = 2 * i + 1;
            int c2 = 2 * i + 2;
            int max = i;//假设max是最大数值
            //假设c1和c2不存在不需要往下判断
            if (c1 < n && tree[c1] > tree[max])
            {
                max = c1;
            }
            if (c2 < n && tree[c2] > tree[max])
            {
                max = c2;
            }
            if (max != i)  //需要做交换
            {
                swap(tree, max, i);
                heapify(tree, n, max);
            }

        }



                /*
          * parent=(i-1)/2
          *  c1=  2i+1
          *  c2=  2i+2
          */

    }
原文地址:https://www.cnblogs.com/tianranhui/p/10637121.html