算法学习笔记之堆排序


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AlgorithmTest
{
    class HeapSort
    {
        private void Max_Heapify ( int[] arr,int hLen, int i )
        {
            int left = 2*i;
            int right = 2 * i +1;
            int largest = i;
            if (left <= hLen-1 && arr[left] > arr[i])
            {
                largest = left;
            }
            if (right <= hLen-1 && arr[right] > arr[largest])
            {
                largest = right;
            }
            if (largest != i)
            {
                int temp = arr[largest];
                arr[largest] = arr[i];
                arr[i] = temp;

                Max_Heapify(arr, hLen, largest);
            }
        }

        private void Build_Max_Heap ( int[] arr )
        {
            int hLen = arr.Length;
            int half = (hLen-1)/2;
            for (int i = half; i >= 0; i--)
            {
                Max_Heapify(arr,hLen, i);
            }
        }

        public void Heap_Sort ( int[] arr )
        {
            Build_Max_Heap(arr);
            int hlen = arr.Length;
            for (int i = arr.Length -1; i >= 1; i--)
            {
                int temp = arr[i];
                arr[i] = arr[0];
                arr[0] = temp;

                hlen--;
                Max_Heapify(arr, hlen, 0);
            }
        }
    }
}

点赞