基本思想 对于给定的n个记录,初始时把这些记录看做一颗顺序存储的二叉树,然后将其调整为一个大顶堆,然后将堆的最后一个元素与对顶元素进行交换后,堆的最后一个元素即为最大记录;接着将前(n-1)个元素重新调整为一个大顶堆,再将堆顶元素与当前堆的最后一个元素进行交换后得到次大的记录,重复该过程知道调整的堆 ...
分类:
编程语言 时间:
2017-03-28 13:13:04
阅读次数:
216
<转> 一.数据结构部分 1.数组和链表的区别。(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有 ...
分类:
编程语言 时间:
2017-03-27 18:41:08
阅读次数:
240
一、美团笔试 问答题: 1.JavaScript把一个参数从页面A传递给页面B,进行某些操作,然后由页面B回传给页面A 2.各种排序算法的时间复杂度:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序。 参考:http://blog.chinaunix.net/uid-25906157-id- ...
分类:
其他好文 时间:
2017-03-26 18:15:58
阅读次数:
268
算法,是系统软件开发,甚至是搞软件的技术人士的核心竞争力,这一点,我坚信不疑。践行算法实践,已经有一段时间没有practise了,今天来一个相对麻烦点的,堆排序。 1. 什么是堆(Heap) 这里说的堆,是一种数据结构,不是指计算机系统中的存储类型。堆是一种完全二叉树。说到完全二叉树,估计很多人都会 ...
分类:
编程语言 时间:
2017-03-23 12:43:13
阅读次数:
274
堆排序基本思想(最大堆): 1. 将初始待排序关键字序列(R1,R2....Rn)构建成最大堆,此时堆为初始的无序堆; 2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 3. ...
分类:
编程语言 时间:
2017-03-22 22:42:57
阅读次数:
253
堆排序是排序的一种,一般有大根对和小根堆之说,大根对,根节点的值比左右子树的根节点的值要大。建堆我们一般是一个完全二叉树。堆排序一般面向数据量比较大的时候,数据量比较小的时候,不适合使用堆排序,比如有种情况就是topN算法的实现,一般都是借助于一个大根对来实现,扫描海量数据,把海量数据中的把最大的前 ...
分类:
编程语言 时间:
2017-03-19 17:38:34
阅读次数:
203
(一)插入排序 每次循环之前,前面i位总是有序的。 (二)冒泡排序 每次循环,跟无序子list的首位比,每次循环有一个最值沉到/浮到这个首位 (三)快速排序 每次抽第一个数为flag,然后调整成左边比他小,右边比他大,随后递归 (四) 堆排序 ...
分类:
编程语言 时间:
2017-03-19 16:12:40
阅读次数:
267
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。 1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者 ...
分类:
其他好文 时间:
2017-03-18 17:26:41
阅读次数:
170
前言 面试中被问到了一个题目(http://www.voidcn.com/blog/u010943214/article/p-3808842.html),然后重温了一遍堆排序。 问题: 给你一个双向链表,有序输出, 限制: 空间复杂度O1, 时间复杂度nlogn,最坏不能退化n2 思路: 1 根据双 ...
分类:
编程语言 时间:
2017-03-12 19:20:15
阅读次数:
171
一、简单选择排序和堆排序都属于选择排序 选择排序的思想是:每一趟从待排序的记录中选出关键字最小的记录,按顺序放在以排序的记录序列的后面,知道全部拍完为止。 二、简单选择排序(直接选择排序) 1.简单选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少。 每次找出当前无序队列中的 ...
分类:
编程语言 时间:
2017-03-11 10:40:34
阅读次数:
365