C# 算法之堆排序

[一鳥飛從過,萬仗霓虹醒]
偷圖
在這裏插入圖片描述

堆排序(Heap Sort)

堆介紹

想要了解堆排序,就必須得先知道堆是什麼:
堆通常是一個可以被看做一棵完全二叉樹的數組對象。
(完全二叉樹是指:1.每一個節點最多隻有兩個子節點(二叉樹),2.只有上一層滿了,纔能有下一層,3.只能從從左到右依次排序)
堆有兩種:
大頂堆:每個父節點都大於子節點(比如50大於45,40)
小頂堆:每個父節點都小於子節點(比如10小於20,15)

在這裏插入圖片描述

堆排序邏輯

再偷圖
在這裏插入圖片描述

簡單來講,堆排序的要點在於(以下特指從小到大排序):
1.構造大頂堆,即將最大數字上浮到最上面的根節點上
2.將最大值取出放置最後
3.調整堆至大頂堆(就是重複第一步)

代碼

總代碼

        public int[] HeapSort3(int[] array)
        {
            var heapSize = array.Length - 1;//獲取數組 最大下標
            //構建大頂堆
            BuilderMaxHeap3(array, heapSize);
            //for循環
            for (int i = heapSize; i >= 0; i--)
            {
                //替換首位和最後一個
                swap(array, i, 0);
                //繼續構建大頂堆
                BuilderMaxHeap3(array, i - 1);
            }
            return array;
        }

構建大頂堆

        private void builderMaxHeap(int[] array, int heapSize)
        {
            //獲取最後一個非葉子節點
            int parser = (int)Math.Floor((double)((heapSize + 1) / 2 - 1));
            //for循環,從下往上依次構建
            for (int i = parser; i >= 0; i--)
            {
                //調整大頂堆
                MaxHeapify3(array, i, heapSize);
            }
        }

注:非葉子節點是指,有子節點的節點
關於最後一個非葉子節點的推論可以看:
十大排序算法----堆排序(最後一個非葉子節點的序號是n/2-1的推理)
此處是因爲用的是索引,所以需要在"n/2-1"的基礎上,n需要加一

調整堆(大數上浮)

        private void MaxHeapify(int[] array, int index, int heapSize)
        {
            var iMax = index;
            var iLeft = 2 * index + 1;//index節點的左子節點
            var iRight = 2 * (index + 1);//index節點的右子節點

            //如果左節點大於index節點,則大值爲左節點
            if (iLeft <= heapSize && array[index] < array[iLeft])
            {
                iMax = iLeft;
            }
            //如果右節點大於index節點,則大值爲右節點
            if (iRight <= heapSize && array[iMax] < array[iRight])
            {
                iMax = iRight;
            }
            //大值不爲index節點,則交換,並重新調整
            if (iMax != index)
            {
                swap(array, iMax, index);
                MaxHeapify(array, iMax, heapSize);//因爲已經變更了子節點,所以子節點也要重新調整
            }
        }

偷圖源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章