NB二人组----堆排序

堆排序前传--树与二叉树简介

特殊且常用的树--二叉树 

两种特殊的二叉树

二叉树的存储方式

二叉树小结

堆排序

堆这个玩意.......

堆排序过程:

堆排序的算法程序(程序需配合着下图理解):

def sift(data,low,high):   # 调整函数
    i = low  # 树的根  也就是父亲 ,这里只领导
    j = 2 * i + 1 # 根的左孩子 也就是 儿子 ,这里指小领导
    tmp = data[i]  # 把根 取出来 做调整 , 在这里 领导
    while j <= high:  # high其实就是 根的右儿子(也就是最后一个儿子),如果 j= high 则表示没有右儿子,也就是说这里必须有儿子在
        if j < high and data[j] < data[j + 1]: # j < high 代表有右儿子 , data[j] < data[j + 1] 说明右儿子比左儿子大
            j += 1 # 这个 j 则变为右儿子 ,也就是 若有比 j 大的值,则 j 就变为比他大的那个值
        if tmp < data[j]: # 如果领导不能干
            data[i] = data[j] # 则小领导上位
            i = j # 小领导变为大领导
            j = 2 * i + 1 # 小小领导变为小领导
        else: # 如果领导能干
            break # 那就待着吧
        data[i] = tmp # 到最后 i 这里肯定会有空位 ,所以无论 tem 是谁 都要占住这个空位

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/9214726.html

时间: 2024-11-14 13:08:32

NB二人组----堆排序的相关文章

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

白话经典算法二叉堆排序之思想简介

常用的排序算法有冒泡排序,插入排序和选择排序.他们的时间复杂度是o(n2),与数据量的平方成正比.他们的效率还是比较低的.现在来说说他们的效率为什么比较低下.以冒泡排序为例,它每一轮都是与相邻的元素进行交换,交换的距离为1,每次每个(没有冒泡出来的)元素都要与前一个比较再交换.每次相邻的比较只能比较出两个元素的大小,不能以整个数组进行参照来确定在整个数组里的大小,也就是说每次的比较不能确定其他元素的相对位置,因而每次比较的贡献不大,所以这样的比较是笨拙的,进而需要完全比较O(n2)次才能得出正确

温故知新,基础复习(二叉堆排序)

温故知新,基础复习(二叉堆排序) 最小堆(最终数组的数据是降序),最大堆(最终数组的数据是升序) 下例是最小堆 #include <stdio.h> #include <stdlib.h> void Swap(int Arra[],unsigned int LeftIndex,unsigned int RightIndex) { int TeampValue = Arra[LeftIndex]; Arra[LeftIndex]=Arra[RightIndex]; Arra[Righ

排序算法(二)堆排序

一.选择排序的问题 如果有n个数排序,简单排序需要选取一个极值(最大值或者最小值)需要比较n-1次.但是,每一轮比较并没有把以前比较过的结果保存下来,导致下一轮比较的时候会有比较过的数据继续比较大小,这其实影响了效率,做了很多无用功. 堆排序是对简单选择排序的改进. 堆是一种数据结构,是用完全二叉树构建的大顶堆或者小顶堆,有的称为大根堆和小根堆. 二.堆排序的准备知识 1.二叉树 二叉树是至多存在两个子树的树结构. 二叉树的每一个结点度数不超过2(至多2棵子树) 2.深度 根结点为第一层,根的子

华为上机练习题--按身高找出最佳二人组

题目: 要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高. Smple input:161 189 167 172 188 Sample outPut: 188 189 分析:我的理解就是先逆序排好数值, 然后逐对比较身高差值, 找出身高差值最小的然后输出 代码如下: package com.wenj.test; /** * 要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-

排序算法之NB三人组

快速排序 思路: 例如:一个列表[5,7,4,6,3,1,2,9,8], 1.首先取第一个元素5,以某种方式使元素5归位,此时列表被分为两个部分,左边的部分都比5小,右边的部分都比5大,这时列表变成了[2,1,4,3,5,6,7,9,8] 2.再对5左边进行递归排序,取5左边部分的第一个元素2,使2归位,这时5左边的部分变成了[1,2,4,3] 3.2归位后再对2右边5左边的部分即[4,3]进行排序,然后整个列表中5左边的部分就完成了排序 4.再使用递归方法对5右边的部分进行递归排序,直到把列表

软件工程二人组

作业要求: 自选题目(不少于500行代码),进行结对编程 轮流担任领航员和驾驶员 记录结对编程的过程,写成结对博客 1.结对题目,写清需求 2.上传代码(截图),两人合作的合影 3.约定的规范 4.记录时间 5.心得和体会 Deadline 9月18日 23:59:59 小组成员: 陈晓宇  004 梅  寒  003 一.1.项目名称:五子棋 2.项目需求:一个简单的五子棋,实现两个人对弈的功能 二.截图1为上传到github图片 三.约定的规范: 1.将代码规范化:先载入一个没格式的程序,之

序列化二叉堆与二叉堆排序

前言 二叉堆分为最大堆与最小堆,一组不规则的完全二叉树或者近完全二叉树,可以通过调整称为二叉堆. 序列化: 形成二叉堆通过下沉. 插入元素通过上浮. 排序: 二叉堆的最大堆为父节点一定大于或者等于子节点,堆顶一定最大. 如果最小堆的堆顶与最后一个元素交互,那么最后一个元素一定最大. 如果最后一个元素不参加排序,那么是一颗新的树,新的树在形成最大堆,然后和堆顶又和最后一个元素交换,继续前面的操作. 将会形成一个从小到大排序. 下沉与上浮 下沉 原理:让每一个元素和它的子节点对比,代码简单明了. p

算法导论(二)堆排序

debug这么久hhhhhhh 话不多说 贴代码 这里完全可以 讲exchange 写成一个单独的函数来减少代码量 复用: #include <iostream> #include <cstdlib> using namespace std; void Max_Heapify(int *a,int i,int _size) { int l,r,largest; int temp; l = 2*i; r = 2*i+1; if(l<=_size && a[l]&