C# 堆

C# 堆
堆是一種非常有用的數據結構,下面的C#以插入數據的方式創建最大堆,然後實現了堆的插入和刪除操作。
  //構建最大堆,
    public class MyHeap
    {
        List<int> heap = new List<int>();
        int temp;
        public MyHeap()
        {
            heap.Insert(0, -1);//第0位置保存數據-1,該數據無用
        }
        public void insertData(int d)
        {
            heap.Insert(heap.Count, d);
            adjustUp(heap.Count-1);
        }
        //向上調整堆
        private void adjustUp(int position)
        {
            //當前點的父節點數據小於當前點,則需要交換當前點父節點,接下來需要遞歸對當前點的父節點進行操作
            if (Math.Floor((double)position / 2) > 0 && heap[(int)(Math.Floor((double)position / 2))] < heap[position])
            {
                exchange(position, (int)(Math.Floor((double)position / 2)));
                adjustUp((int)(Math.Floor((double)position / 2)));
            }
        }
        //向下調整堆
        private void adjustDown(int position)
        {
            if (position * 2 < heap.Count && heap[position] < heap[position * 2])
            {
                exchange(position, position * 2);
                adjustDown(position * 2);
            }
            else if (position * 2+1 < heap.Count && heap[position] < heap[position * 2+1])
            {
                exchange(position, position * 2+1);
                adjustDown(position * 2+1);
            }
        }
        private void exchange(int i,int j)
        {
            temp = heap[i];
            heap[i] = heap[j];
            heap[j] = temp;
        }
        //遍歷找到第一個數值=d的節點i,將堆的最後一個節點挪到i處,向下遞歸調整i爲根節點的堆
        public void deleteData(int d)
        {
            int i =0;
            for ( i = 1; i < heap.Count; i++)
            {
                if (heap[i] == d)
                    break;
            }
            if (i == heap.Count)
                return;
            else
            {
                heap[i] = heap[heap.Count - 1];
                heap.RemoveAt(heap.Count - 1);
                adjustDown(i);
            }
        }
        public void printHeap()
        {
            for (int i = 1; i < heap.Count; i++)
            {
                Console.Write(heap[i] + " ");
            }
        }
    }
下面是測試的程序:插入數據構建堆,然後刪除數據。
  MyHeap myheap = new MyHeap();
            myheap.printHeap();
            myheap.insertData(45);
            myheap.insertData(36);
            myheap.insertData(18);
            myheap.insertData(53);
            myheap.insertData(72);
            myheap.insertData(30);
            myheap.insertData(48);
            myheap.insertData(93);
            myheap.insertData(15);
            myheap.insertData(35);
            myheap.printHeap();
            Console.WriteLine("");
            Console.WriteLine("刪除72");
            myheap.deleteData(72);
            myheap.printHeap();
            Console.Read();

代碼:http://download.csdn.net/detail/luozuolincool/7931333

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