Exemple #1
0
        /// <summary>
        /// ヒープ化されている配列リストに新しい要素を追加する。
        /// </summary>
        /// <param name="array">対象の配列リスト</param>
        static void PushHeap(List <ValueAndPriority> array, ValueAndPriority elem)
        {
            int n = array.Count;

            array.Add(elem);

            while (n != 0)
            {
                int i = (n - 1) / 2;
                if (array[n].priority.CompareTo(array[i].priority) > 0)
                {
                    ValueAndPriority tmp = array[n]; array[n] = array[i]; array[i] = tmp;
                }
                n = i;
            }
        }
Exemple #2
0
        /// <summary>
        /// ヒープから最大値を削除する。
        /// </summary>
        /// <param name="array">対象の配列リスト</param>
        static void PopHeap(List <ValueAndPriority> array)
        {
            int n = array.Count - 1;

            array[0] = array[n];
            array.RemoveAt(n);

            for (int i = 0, j; (j = 2 * i + 1) < n;)
            {
                if ((j != n - 1) && (array[j].priority.CompareTo(array[j + 1].priority) < 0))
                {
                    j++;
                }
                if (array[i].priority.CompareTo(array[j].priority) < 0)
                {
                    ValueAndPriority tmp = array[j]; array[j] = array[i]; array[i] = tmp;
                }
                i = j;
            }
        }