堆排序 C#解法

using System;

namespace 堆排序___顺序存储
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] data = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
            HeapSort(data);
            foreach (int i in data)
                Console.Write(i + " ");
            Console.ReadKey();
        }
        public static void HeapSort(int[] data)
        {
            for (int i = data.Length / 2; i >= 1; i--)
                HeapAjust(i, data, data.Length);
            for (int i = data.Length; i > 1; i--)
            {
                int temp1 = data[0];
                data[0] = data[i - 1];
                data[i - 1] = temp1;
                HeapAjust(1, data, i - 1);
            }
        }
        private static void HeapAjust(int numberToAjust, int[] data, int maxNumber)
        {
            int maxNodeNumber = numberToAjust;
            int tempI = numberToAjust;
            while (true)
            {
                int leftChildNumber = tempI * 2;
                int rightChildNumber = leftChildNumber + 1;
                if (leftChildNumber <= maxNumber && data[leftChildNumber - 1] > data[maxNodeNumber - 1]) maxNodeNumber = leftChildNumber;
                if (rightChildNumber <= maxNumber && data[rightChildNumber - 1] > data[maxNodeNumber - 1]) maxNodeNumber = rightChildNumber;
                if (maxNodeNumber != tempI)
                {
                    int temp = data[tempI - 1];
                    data[tempI - 1] = data[maxNodeNumber - 1];
                    data[maxNodeNumber - 1] = temp;
                    tempI = maxNodeNumber;
                }
                else break;
            }
        }
    }
}

思路:将数组构造成最大堆,此时根节点位置为最大元素,然后将第一个元素与末尾元素交换,使最大元素置于数组末端,之后继续将剩余堆构造成最大堆,重复该操作。时间复杂度为O(nlogn)。

猜你喜欢

转载自blog.csdn.net/qq_43461641/article/details/89532081