watch = new Stopwatch(); watch.Start(); HeapSort(list); watch.Stop(); Console.WriteLine("n堆排序耗费时间:" + watch.ElapsedMilliseconds); Console.WriteLine("输出前十个数" + string.Join(",", list.Take(10).ToList())); }
}
///<summary> /// 构建堆 ///</summary> ///<param>待排序的集合</param> ///<param>父节点</param> ///<param>输出根堆时剔除最大值使用</param> static void HeapAdjust(List<int> list, int parent, int length) { //temp保存当前父节点 int temp = list[parent];
//得到左孩子(这可是二叉树的定义,大家看图也可知道) int child = 2 * parent + 1;
while (child < length) { //如果parent有右孩子,则要判断左孩子是否小于右孩子 if (child + 1 < length && list[child] < list[child + 1]) child++;
//父亲节点大于子节点,就不用做交换 if (temp >= list[child]) break;
//将较大子节点的值赋给父亲节点 list[parent] = list[child];
//然后将子节点做为父亲节点,已防止是否破坏根堆时重新构造 parent = child;
//找到该父亲节点较小的左孩子节点 child = 2 * parent + 1; } //最后将temp值赋给较大的子节点,以形成两值交换 list[parent] = temp; }
///<summary> /// 堆排序 ///</summary> ///<param></param> public static void HeapSort(List<int> list) { //list.Count/2-1:就是堆中父节点的个数 for (int i = list.Count / 2 - 1; i >= 0; i--) { HeapAdjust(list, i, list.Count); }
//最后输出堆元素 for (int i = list.Count - 1; i > 0; i--) { //堆顶与当前堆的第i个元素进行值对调 int temp = list[0]; list[0] = list[i]; list[i] = temp;
//因为两值交换,可能破坏根堆,所以必须重新构造 HeapAdjust(list, 0, i); } } } }
结果公布:
堆排序此时心里很尴尬,双双被KO,心里想,一定要捞回面子,一定要赢,
于是堆排序提出了求“前K大问题”。(就是在海量数据中找出前几大的数据),
快排一口答应,小意思,没问题。
双方商定,在2w随机数中找出前10大的数:
复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics;
(编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|