static void HeapSort( int[] arr, int i)
        {
            int temp;
            int k;
            for (int n = ((i-1) / 2); n >= 0; n--)  //生成堆根
            {
                k = n;
                temp = arr[n];  

                if ((2 * (n + 1)) < i && arr[(n + 1) * 2] > temp)  //将父节点与子节点进行比较
                { 
                    k = ((n + 1) * 2);  // 比较结果为真,则将节点的序号填入
                    temp = arr[k];  //将元素序号内的数值填到中继变量
                }

                if (2 * n + 1 < i && arr[2 * n + 1] > temp)  // 将子节点与堆内当前最大值进行比较
                {
                    k = 2 * n + 1;   // 比较结果为真,则将节点的序号填入
                    temp = arr[k];  //将元素序号内的数值填到中继变量
                }

                if (k != n)
                {
                    arr[k] = arr[n];  //将较大的元素与父节点交换
                    arr[n] = temp;
                }
            }

            if (i > 2)  // 此时,父点为零  n =(i/2)= 0  
            {
                // 将最大的元素下沉到数组的末尾或已下沉元素的前面
                temp = arr[i - 1];
                arr[i - 1] = arr[0];
                arr[0] = temp;  

                HeapSort(arr, i-1);  // 递归时,将下沉元素排除在递归在外
            }
        }