class Program { static void Main(string[] args) { int[] arr = { 4, 10, 3, 5, 1, 2,16}; int size = arr.Length; Heapsort(arr, size); foreach (int item in arr) { Console.WriteLine(item); } Console.ReadKey(); } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void Heapsort(int[] tree, int n) { build_heap(tree, n); int i; for (i = n - 1; i >= 0; i--) { swap(tree, i, 0); heapify(tree, i, 0); } } public static void build_heap(int[] tree, int n) { int last_node = n - 1; int parent = (last_node - 1)/2; int i; for (i = parent; i >= 0; i--) { heapify(tree, n, i); } } public static void heapify(int[] tree,int n,int i) { if (i >= n) { return; } int c1 = 2 * i + 1; int c2 = 2 * i + 2; int max = i;//假设max是最大数值 //假设c1和c2不存在不需要往下判断 if (c1 < n && tree[c1] > tree[max]) { max = c1; } if (c2 < n && tree[c2] > tree[max]) { max = c2; } if (max != i) //需要做交换 { swap(tree, max, i); heapify(tree, n, max); } } /* * parent=(i-1)/2 * c1= 2i+1 * c2= 2i+2 */ }