堆排序的一种实现

 1 void HeapAdjust(int a[],int s,int m) 2 {
 3     int temp = a[s];
 4
 5     for(int j=2*s;j<=m;j=j*2)
 6     {
 7         if(j<m && a[j]<a[j+1])
 8             ++j;
 9         if(temp>=a[j])  //如果只写大于而不写等于会出现问题,
10             break;
11         else
12         {
13             a[s]=a[j];
14             s=j;
15         }
16     }
17
18     a[s] = temp;
19 }
20
21 void HeapSort(int a[],int n)
22 {
23     for(int i=n/2-1;i>=0;--i)
24         HeapAdjust(a,i,n-1);
25     for(int i=n-1;i>0;--i)
26     {
27         swap(a[0],a[i]);  //将大顶堆的根与最后一个元素相交换
28
29         HeapAdjust(a,0,i-1);
30     }
31 }

HeapAdjust(int a[],int s,int m)实现的功能是一次调整,假设数组中除了a[s]外都满足大顶堆的定义。

HeapSort(int a[],int n)中有两步,第一步是根据原来的数组建立一个符合定义的大顶堆。    然后把大顶堆的第一个元素与最后一个元素想交换,那么势必使得原来的

大顶堆不在符合定义(即从a[0]到a[i-1])已不是大顶堆,要调整。

时间: 2024-11-29 09:13:49

堆排序的一种实现的相关文章

python实现堆排序的三种方式

# -*- coding: utf-8 -*- """ Created on Fri May 16 14:57:50 2014 @author: lifeix """ import heapq #堆排序 #第一种实现 def Heapify(a, start, end): left = 0 right = 0 maxv = 0 left = start * 2 right = start * 2 + 1 while left <= end:

堆排序是一种常见的复杂度为log复杂度的算法,具体实现如下:

void adjust_element(vector<int>& data, int i) { if (2 * i + 1 >= data.size()) return ; int index = 2 * i + 1; int min = data[index]; if (2 * i + 2 < data.size() && data[2 * i + 2] < min) { min = data[2 * i + 2]; index = 2 * i +

必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序示例: 合并方法: 设r[i-n]由两个有序子表r[i-m]和r[m+1-n]组成,两个子表长度分别为n-i +1.n-m. j=m+1:k=i:i=i; //置两个子表的起始下标及辅助数组的起始下标 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束 //选取r[i]和r[j]

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

八大排序算法之四选择排序—堆排序(Heap Sort)

堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的.如: (a)大顶堆序列:(96, 83,27,38,11,09) (b)  小顶堆序列:(12,36,24,85,47,30,53,91

C++实现堆排序

堆排序是一种具有合并排序和插入排序共同优点的排序方法.它的时间复杂度为O(nlgn),它也是一种原地排序算法:在任何时候,数组中只有常数个元素存储在输入数组以外.要介绍堆排序首先要介绍什么是堆. 1.建堆:堆数据结构是一种数组对象,它可以被视为一颗完全二叉树,如下图.右边数组表示的堆可以用左边的完全二叉树来表示,其中若父节点对应数组下标为i,则其左孩子对应数组下标为2*i,右孩子为2*i+1. 具体代码如下: void buildMaxHeap(int a[] , int heapSize){

9种排序

一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方法 Function.prototype.method = function(name, func){ this.prototype[name] = func; return this; }; 在下面的排序中都要用到这个方法. 三:9种排序算法的思路和实现 1> 插入排序 基本思路: 从无序区的第一个元

C语言几种常用的排序算法

/* ============================================================================= 相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义): 1.稳定排序和非稳定排序    简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就 说这种排序方法是稳定的.反之,就是非稳定的.  比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,

排序算法2--简单选择排序、堆排序

一.简单选择排序和堆排序都属于选择排序 选择排序的思想是:每一趟从待排序的记录中选出关键字最小的记录,按顺序放在以排序的记录序列的后面,知道全部拍完为止. 二.简单选择排序(直接选择排序) 1.简单选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少. 每次找出当前无序队列中的最小的元素与第一个交换位置,再选择第二小的与第二个交换位置 原始队列:   3 5 6 2 4 1(最小元素1与3交换) 第一步: 1 5 6 2 4 3 (当前最小元素2与5交换) 第二步: 1 2