堆排序

排序1-3、堆排序

亡梦爱人 提交于 2019-11-27 09:36:50
先说说选择排序: 堆排序是对选择排序的改进 算法1,是生成一个传统的最小堆,逐步取树根元素,存入数组 真正的堆排序算法,思想是把A调成一个最大堆,把最大元素跟末尾元素交换,最大堆大小减1,然后调整,知道最大堆只有1个元素。 这里的最大堆跟传统的最大堆区别在于,它的下标是从0开始的,写代码的时候要注意一下。 来源: https://www.cnblogs.com/maider/p/11356374.html

疯狂游戏后台面试经历

百般思念 提交于 2019-11-27 09:30:57
1. 自我介绍 ​ 这是面试相当重要的一个环节,建议提前准备好模板,自己多对着镜子练一练。 2. 大学里面除了上课还做过什么? ​ 我只说了acm,但是面试官似乎不太满意。 3. 你现在在100层,一次只能下1层或者2层,请问到1层有几种方法。 ​ 写代码的时候一定要注意代码规范,而且这个题我没用记忆化,可能面试官只考察你对递归的使用。 int fnc(int n) { if(n == 1) { return 1; } else if(n == 2) { return 2; } return fnc(n - 1) + fnc(n - 2); } 4. 面试最后一题用了优先队列,讲一讲优先队列的内部排序是怎么样的 ​ 我上来就说了快排,但想了想还是说了堆排序,因为没当我们push进去一个元素,前面的元素都已经排好了,所以在这种情况下用堆排序就好了。我还以为要问堆排序的实现(提前没看),慌得一批,但是没问。 5. 把C++多态的实现讲一下吧 ​ 只要面试C++都会问这个问题,建议准备模板。 6. 你刚才提到在工作中做过负载均衡,简单讲一讲吧。 ​ 其实就是P2P模式,讲了讲C/S模式和它的区别,和用在项目中的好处。 6. 都用过什么数据库,说一下数据库的索引 ​ 就是让你介绍一下b树,结果我上来懵了说了个红黑树,刚想改口,面试官就说下一个问题了。 7.说一下tcp和udp的区别

从无序数组中找出第K大的数

这一生的挚爱 提交于 2019-11-27 09:13:59
该题目的两种实现方式,第一种是用堆排序(其中数组用到了二叉树的性质),第二种是利用快速排序来实现. 第一种:堆排序 最大堆进行升序排序,主要步骤是 1.初始化堆:将数列a[1...n]构造成最大堆。 2.交换数据:将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。 1 static void Swap<T>(ref T t1, ref T t2) { 2 T temp = t1; 3 t1 = t2; 4 t2 = temp; 5 } 6 7 static void Maxheap_Down(int[] arr, int start, int end) { 8 9 int current = start; 10 int left = 2 * current + 1; 11 int temp = arr[current]; 12 13 for (; left <= end; current = left, left = 2 * left + 1) { 14 if (left < end && arr[left] < arr[left + 1]) { 15

排序算法 - 堆排序(图解)

a 夏天 提交于 2019-11-27 08:45:13
【原文: https://www.cnblogs.com/fortunely/p/10254161.html 】 1.基本概念 堆 ,分为大顶堆(大堆)和小顶堆(小堆),是顺序存储的完全二叉树,并且满足以下特性之一: (1) 任意非终端结点关键字不小于左右子结点(大堆) ki >= k2i+1并且ki>=k2i+2 其中,0 <= i <= (n-1)/2,n是数组元素个数 (2) 任意非终端结点关键字不大于左右子结点(小堆) ki <= k2i+1并且ki<=k2i+2 其中,0 <= i <= (n-1)/2,n是数组元素个数 调整 (也有叫筛选): 从当前结点(要求是非终端结点)开始, 对于大堆,要求当前结点关键字不小于子结点,如不符合,则将最大的子结点与当前结点交换。循环迭代交换后的子树,确保所有子树都符合大堆特性。 小堆调整过程类似。 2.基本思想 堆排序就是利用构建堆和输出堆顶元素的过程,不断对堆进行调整以保证当前结点及其孩子结点满足堆特性,从而达到对初始数组元素进行排序的目的。 大堆通常对应升序序列,小堆通常对应降序排列。 核心步骤: 1)构建堆(大堆/小堆) 从最后一个非终端结点开始,向前进行调整,保证当前结点及其子树符合堆特性; 2) 输出有序序列 交换堆顶与末尾叶子结点,堆顶输出到数组的有序序列末尾,而不参与堆的调整。从交换后的堆顶开始调整

堆排序

做~自己de王妃 提交于 2019-11-27 08:38:00
堆排序 时间复杂度 \(\mathrm{O}(NlogN)\) 来源: https://www.cnblogs.com/Anthony-ling/p/11355025.html

堆排序(Heap Sort)

混江龙づ霸主 提交于 2019-11-26 18:21:59
public class HeapSort { public static void sort(Comparable[] data) { // 构建最大堆 buildMaxHeap(data); // 循环,每次把根节点和最后一个节点调换位置 for (int i = data.length; i > 1; i--) { Comparable tmp = data[0]; data[0] = data[i - 1]; data[i - 1] = tmp; // 堆的长度减少1,排除置换到最后位置的根节点 maxHeapify(data, 1, i - 1); } } // 根据输入数组构建一个最大堆 private static void buildMaxHeap(Comparable[] data) { for (int i = data.length / 2; i > 0; i--) { maxHeapify(data, i, data.length); } } //堆调整,使其生成最大堆 private static void maxHeapify(Comparable[] data, int parentNodeIndex, int heapSize) { // 左子节点索引 int leftChildNodeIndex = parentNodeIndex * 2; //

【转载】Amit’s A star Page 中译文

你离开我真会死。 提交于 2019-11-26 17:39:37
GameRes游戏开发资源网 http://www.gameres.com Amit's A star Page 中译文 Amit's A star Page中译文原文链接: http://dev.gameres.com/Program/Abstract/Arithmetic/AmitAStar.mht 译序 这篇文章很适合A*算法的初学者,可惜网上没找到翻译版的。本着好东西不敢独享的想法,也为了锻炼一下英文,本人译了这篇文章。 由于本人英文水平非常有限,六级考了两次加一块不超过370分,因此本译文难免存在问题。不过也算是抛砖引玉,希望看到有更多的游戏开发方面的优秀译作出现,毕竟中文的优秀资料太少了,中国的游戏开发者的路不好走。 本人能力有限,译文中有小部分词句实在难以翻译,因此暂时保留英文原文放在译文中。对于不敢确定翻译是否准确的词句,本人用圆括号保留了英文原文,读者可以对照着加以理解。 A*算法本身是很简单的,因此原文中并没有过多地讨论A*算法本身,而是花了较大的篇幅讨论了用于保存OPEN和CLOSED集的数据结构,以及A*算法的变种和扩展。 编程实现A*是简单的,读者可以用STL对本文中的伪代码加以实现(本人已花一天时间实验过基本的A*搜索)。但是最重要的还是对A*本身的理解,这样才可以在自己的游戏中处理各种千变万化的情况。 翻译本文的想法产生于2006年5月

堆排序

五迷三道 提交于 2019-11-26 16:38:50
原理 将数组构建成大顶堆,然后将根节点与堆底元素交换,最大值排到了末尾,再将剩下的n-1个元素再构成大顶堆,重复操作。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: 完全二叉树 假设一个二叉树有n层,那么如果第1到n-1层的每个节点都达到最大的个数:2,且第n层的排列是从左往右依次排开的,那么就称其为完全二叉树 分析 最好、最坏,平均都为o(nlogn) 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 代码 void heap_build(int &arr[],int root,int length){ int lchild = root*2+1;//左子节点索引,从最后一层非叶子节点开始递归的 if(lchild < length){//保证左子节点不越界 int flag=lchild;//左右节点中最大值的索引 int rchild = lchild+1;//右子节点索引 if(rchild < length){ if(arr[rchild]>a[flag]) flag=rchild; } if(a[root]<arr

算法导论第六章 堆排序

不羁岁月 提交于 2019-11-26 14:58:27
主要内容: 堆、最大堆、最小堆的基本概念 堆的操作:调整、创建、排序 采用堆实现优先级队列 基本概念 堆 ( heap )亦被称为: 优先队列 ( priority queue ) 逻辑定义: n个元素序列{k 1 ,k 2 ...k i ...k n },当且仅当满足下列关系时称之为堆: (k i <= k 2i ,k i <= k 2i+1 )或者(k i >= k 2i ,k i >= k 2i+1 ), (i = 1,2,3,4...n/2) 堆的实现通过构造 二叉堆 (binary heap),实为二叉树的一种。 性质 : 1、任意节点小于或大于它的所有后裔,最小元或最大元在堆的根上( 堆序性 )。将根节点最大的堆叫做 最大堆或大根堆 ,根节点最小的堆叫做 最小堆或小根堆 。常见的堆有二叉堆、斐波那契堆等。 2、堆总是一棵完全树。堆只需要满足父节点大于两个子节点,而子节点之间没有要求。作为一颗完全树,一层中的节点是从左到右填满的。如果一个节点没有左儿子,那么它一定没有右儿子。并且在第h层中如果存在节点,那么第h-1层必须是填满的。 堆的操作 调整堆 void adjust_max_heap_recursive(int *datas, int length, int i)//递归调用,最大堆调整 { int left,right,largest; int temp;

排序算法---选择排序

爷,独闯天下 提交于 2019-11-26 12:25:35
1.直接选择排序 1 void selectSort(int *arr, int n) 2 { 3 int i, j; 4 5 for(i = 0; i < n; i++) 6 { 7 int temp = i; 8 9 for(j = i + 1; j < n; j++) 10 { 11 if(arr[j] < arr[temp]) 12 { 13 temp = j; 14 } 15 } 16 17 if(i != temp) 18 { 19 _swap(arr[i], arr[temp]); 20 } 21 } 22 23 } 2.堆排序 1 void makeHeap(int *arr, int i, int n) 2 { 3 while(i >= 0) 4 { 5 int left = 2 * i + 1; 6 int right = 2 * i + 2; 7 8 int temp = -1; 9 if(right < n) 10 { 11 temp = arr[right] > arr[left] ? right : left; 12 } 13 else 14 { 15 temp = left; 16 } 17 18 if(arr[temp] > arr[i]) 19 { 20 _swap(arr[i], arr[temp]); 21 } 22 23 --i; 24 }